Вопрос № 20997: Уважаемые эксперты! Какие существуют функции для работы
с кластерами под Windows (чтение-запись, пометить как плохой и т.д.)? Как определить, какие кластера занимает определённый файл?
...
Вопрос № 20997
Уважаемые эксперты! Какие существуют функции для работы
с кластерами под Windows (чтение-запись, пометить как плохой и т.д.)? Как определить, какие кластера занимает определённый файл?
Отправлен: 17.05.2005, 20:41
Вопрос задал: Александр А.А. (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: DSota
Здравствуйте, Александр А.А.!
Существует функция DeviceIoControl, у нее для каждого случая свои параметроы:
hDevice=CreateFile("\.PhysicalDrive0",...);
или hDevice=CreateFile("\.c:",...); - добавлять два слеша точку и слеш в начале обязательно!
Получить кластера файла:
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to volume
FSCTL_GET_RETRIEVAL_POINTERS, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of input buffer
(LPVOID) lpOutBuffer, // output buffer
(DWORD) nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
typedef struct {
LARGE_INTEGER StartingVcn;//Номер кластера в файле
}STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
тип lpOutBuffer:
typedef struct RETRIEVAL_POINTERS_BUFFER{
DWORD ExtentCount;
LARGE_INTEGER StartingVcn;
struct{LARGE_INTEGER NextVcn; - кратко сказать это и есть кластеры
LARGE_INTEGER Lcn;}
Extents[1];
}RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
Получить карту свободных-занятых кластеров:
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to volume
FSCTL_GET_VOLUME_BITMAP, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of input buffer
(LPVOID) lpOutBuffer, // output buffer
(DWORD) nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
Переместить файл:
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to volume
FSCTL_MOVE_FILE, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of input buffer
NULL, // lpOutBuffer
0, // nOutBufferSize
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
typedef struct{
HANDLE FileHandle;
LARGE_INTEGER StartingVcn;//Номер кластера в файле, который нужно сдвинуть
LARGE_INTEGER StartingLcn;//Кластер на диске, куда нужно сдвинуть
DWORD ClusterCount;//Количество кластеров для сдвига
} MOVE_FILE_DATA.
Ответ отправил: DSota (статус: Студент)
Отправлен: 18.05.2005, 10:24 Оценка за ответ: 5