2012-12-12 1 views
2

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 명이 실패했습니다. 나는이 방법으로 큰 파일을 옮기는 것이 이전에 사용 가능한 클러스터가 더 아래로 내려 가면서 볼륨의 다른 것에 의해 점령 됨으로 인해 실패 할 수 있다는 것을 알고 있습니다. 특히 볼륨에 많은 양의 활동이있는 경우 (시스템 볼륨과 같은 경우). 하지만 나는 커널을 전혀 가지고 있지 않다는 것을 감안할 때 어떻게해야할지 모르겠다. 내가 뭘 잘못하고 있고/또는 어떻게 더 잘할 수 있니?

답변

0

짧은 대답은 아니오입니다. 사용자 모드에서는 그곳으로 갈 수 없습니다. 파일 시스템을 조작하는 나머지 응용 프로그램/운영 체제 프로세스와 항상 경쟁하게 될 것입니다.

정말로이 경로를 사용하려면이 작업을 동기화하는 데 도움이되는 상당히 복잡한 커널 드라이버 (파일 시스템 미니 필터)를 작성해야합니다. 이것은 특히 페이지/스왑 파일을 호스팅하는 볼륨에서의 이동에 대해 까다로울 수 있습니다.

행운을 빈다.

0

두 가지 문제가 있습니다. 첫째, 실제 시스템에서는 항상 다른 활동과 경쟁하고 있습니다 (이전 답변자가 제안한 것처럼). 예를 들어 볼륨 비트 맵을 검색하면 표시되지 않는 다른 프로세스의 작업으로 인해 이미 유효하지 않을 수 있습니다.

둘째, FAT32에는 한 번에 이동할 수있는 양에 대한 제한이있을 수 있습니다. 256Kb (일명 캐시 관리자 매핑보기 크기) 청크로 파일을 이동하는 것이 좋습니다. 이전에 무료였던 공간을 때리는 것과 같은 오류가 발생하면 추론 할 일이 훨씬 줄어 듭니다.

700Mb 파일이있는 경우 700MB의 청크가있는 경우 단일 700Mb 청크보다 성능이 크게 향상 될 수 있습니다.