Re[6]: Дефрагментация и FSCTL_MOVE_FILE
От: bixbit  
Дата: 13.08.12 21:08
Оценка:
D>По-моему, вы путаете VCN и LCN. VCN — это virtual cluster number. Допустим у вас есть файл. Он занимает на диске 5 кластеров. Тогда для этого файла VCN может принимать значения от 0 до 4. LCN — это logical cluster number, то есть номер кластера на томе.

Спасибо большое !
Именно VCN и LCN я и попутал.
Теперь всё работает.

Но я так и не понял почему в FSCTL_MOVE_FILE не прописана переверка этого параметра.
"Но это уже совсем другая история"

Ниже привожу исправленый кусок кода.
Он точно кому-то пригодится:
MoveParams.StartingVcn.QuadPart = 0;
for (ULONG r = 0; r < OutBuf->ExtentCount; r++)
{
    DWORD br;
    MoveParams.ClusterCount =OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart;
    if(DeviceIoControl(hDisk,FSCTL_MOVE_FILE,&MoveParams,sizeof(MoveParams),NULL,0,&br,NULL))
        printf("error %d\n",GetLastError());
    MoveParams.StartingLcn.QuadPart=MoveParams.StartingLcn.QuadPart+MoveParams.ClusterCount;
    MoveParams.StartingVcn.QuadPart = MoveParams.StartingVcn.QuadPart +MoveParams.ClusterCount;
    PrevVCN = OutBuf->Extents[r].NextVcn;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.