windows xp, fat32 시스템 볼륨의 파일 조각 모음에 문제가 있습니다. 나는 조각 모음을 쓰고 있지는 않지만 그 대신에 솔루션의 일부는 디스크에 일정한 파일 세트를 지속적으로 배치해야합니다. 이를 위해 FSCTL_MOVE_FILE ioctl을 사용하여 볼륨에서 충분한 크기의 단일 여유 공간 범위로 파일 범위를 이동합니다. 프로세스는 다음과 같이 진행됩니다Windows XP, 시스템 볼륨, FAT32의 FSCTL_MOVE_FILE
1) 파일을 만듭니다
return m_file.Create(path,
GENERIC_READ | GENERIC_WRITE,
0, NULL,
CREATE_ALWAYS,
FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH |
FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN,
NULL);
2) 제로로 파일을 채 웁니다.
3) 파일이 조각 났는지 확인하십시오. FSCTL_GET_VOLUME_BITMAP으로 볼륨 비트 맵을 수집하고 충분한 크기의 사용 가능한 클러스터 체인을 찾으십시오.
4) 사용 FSCTL_MOVE_FILE 같은 찾을 정도로 파일 조각 모음 : 마지막 호출은 NTFS 시스템과 일반 볼륨에서 잘 작동
MOVE_FILE_DATA input;
input.FileHandle = fileHandle;
input.StartingVcn.QuadPart = 0;
input.StartingLcn.QuadPart = freeExtent.lcn;
input.ClusterCount = totalFileClusters;
DWORD bytesReturned = 0; // unused
::DeviceIoControl(
volumeHandle,
FSCTL_MOVE_FILE,
&input,
sizeof(input),
NULL,
0,
&bytesReturned,
NULL);
있다. XP의 비 시스템 볼륨도 문제가되지 않습니다. 그러나 XP의 FAT32 시스템 볼륨에서는 거의 항상 INVALID_ARGUMENT (87) 오류가 발생합니다. 파일은 약 700MB 크기로 상당히 큽니다. 볼륨에는 약 10GB의 여유 공간이 있습니다. 실패한 fsctl 이후에 오류가 발생하기 전에 파일의 일부가 실제로 이동 된 것을 볼 수 있습니다. 여러 번 시도했지만, 지금까지 50 명이 실패했습니다. 나는이 방법으로 큰 파일을 옮기는 것이 이전에 사용 가능한 클러스터가 더 아래로 내려 가면서 볼륨의 다른 것에 의해 점령 됨으로 인해 실패 할 수 있다는 것을 알고 있습니다. 특히 볼륨에 많은 양의 활동이있는 경우 (시스템 볼륨과 같은 경우). 하지만 나는 커널을 전혀 가지고 있지 않다는 것을 감안할 때 어떻게해야할지 모르겠다. 내가 뭘 잘못하고 있고/또는 어떻게 더 잘할 수 있니?