Как работать с файлом по его ID или получить его HANDLE?
От: Аноним  
Дата: 20.05.09 16:03
Оценка:
Задача: нужно выполнить определенные действия над файлом, открыв его по ID (т.е. получить HANDLE на него или как-то напрямую по его ID).

Я знаю, что HANDLE на файл можно получить при помощи функции OpenFileById, но ее встроенная в студию реализация появляется только с Vist-ы, а мне нужно это сделать на XP.
Пробовал как написано в MSDN использовать библиотеку fileextd.lib, но при попытке открытия файла возвращается значение INVALID_PARAMETER, причем тот же самый код, скомпилированный под висту без использования этой либы работает вполне нормально.

Может быть кто-нибудь может подсказать, как можно получить HANDLE файла по его ID без использования этой функции или хотя бы предположить чем вызвана ошибка при использовании функции из fileextd.lib.

Примерный код открытия файла по ID, который я использовал:
TmpFile – имя файла на том же диске (как и требует OpenFileById).



    TmpFileHandle = CreateFile(    TmpFile.c_str(), 
                        GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);
    if (TmpFileHandle == INVALID_HANDLE_VALUE)
    {
        hResult = HRESULT_FROM_WIN32(GetLastError());
        printf(“CreateFile 1 Error = 0x%X”, hResult);
    }

    //
    //открыть сам файл для получения его описателя
    //
    HANDLE hTargFile = CreateFile(    szFileName, 
                                    GENERIC_READ | GENERIC_WRITE,
                                    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                                    NULL,
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL,
                                    NULL);
    if (hTargFile == INVALID_HANDLE_VALUE)
    {
        hResult = HRESULT_FROM_WIN32(GetLastError());
        printf(“CreateFile 2 Error = 0x%X”, hResult);
    }
    
    //
    //получить буфер с Object ID
    //
    BY_HANDLE_FILE_INFORMATION HFI;
    bRes = GetFileInformationByHandle( hTargFile, &HFI);
    if(!bRes)
    {
        hResult = HRESULT_FROM_WIN32(GetLastError());
        printf(“GetFileInformationByHandle Error = 0x%X”, hResult);
    }

    CloseHandle(hTargFile);

    //
    //создать FILE_ID_DESCRIPTOR
    //
    FILE_ID_DESCRIPTOR FileID;

    FileID.FileId.LowPart = HFI.nFileIndexLow;
    FileID.FileId.HighPart = HFI.nFileIndexHigh;
    FileID.Type = FileIdType;
    FileID.dwSize = sizeof(FileID);

    //
    //открыть файл по ID и вернуть HANDLE
    //
    hFile = OpenFileById( 
                         TmpFileHandle,
                         &FileID,
                         GENERIC_ALL,
                         FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
                         NULL,
                         0);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        hResult = HRESULT_FROM_WIN32(GetLastError());
        printf(“OpenFileById Error = 0x%X”, hResult);
    }


    CloseHandle(TmpFileHandle);



20.05.09 20:37: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
fileid handle openfilebyid
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.