2010-03-22 6 views
2

Windows 조각 모음 API (http://msdn.microsoft.com/en-us/library/aa363911(VS.85).aspx)를 통해 하나의 파일을 조각 모음하려고하지만 파일에 충분한 여유 공간 블록이없는 경우 파일의 다른 부분을 이동하여 공간을 확보하려고합니다.NTFS/FAT32의 논리 클러스터 번호에서 파일에 대한 정보를 찾는 방법은 무엇입니까?

링크 된 문서에는 다른 파일의 움직이는 부분이 언급되어 있지만 이동할 파일을 찾는 방법에 대한 정보는 찾을 수 없습니다. 여유 공간 비트 맵에서 나는 거의 충분한 공간을 찾을 수 있습니다. 그리고 그것을 둘러싼 논리적 클러스터 번호를 알고 있습니다. 그러나이 파일을 둘러싼 파일을 찾을 수 없으며 파일 핸들은 FSCTL_MOVE_FILE을 수행하는 데 필요합니다. 파일의 일부.

API를 통해 또는 MFT를 구문 분석하여 논리 클러스터 번호가 포함되어있는 파일을 확인하고 파일의 가상 클러스터 번호가 비트 맵에서 찾은 논리 클러스터 번호와 일치하는지 확인하십시오.

답변

1

느리지 만 호환되는 방법은 모든 디렉토리에서 파일을 반복적으로 검색하고 FSCTL_GET_RETRIEVAL_POINTERS을 사용하는 것입니다. 그런 다음 해당 클러스터에 대한 결과 VCN-LCN 매핑을 검사합니다.

다른 옵션은 USN 저널에 드라이브의 파일 참조 ID를 가져오고 FSCT_GET_NTFS_FILE_RECORD을 사용하여 $ MFT 파일 레코드를 가져 오는 것입니다.

현재 로딩 시간과로드 지연을 줄이기 위해 디렉토리의 파일 (예 : 큰 게임의 모든 파일)을 묶는 목적으로 Java에서 작성된 간단한 조각 모음 프로그램을 작성 중입니다.

더 빠른 방법을 사용하여 NTFS 또는 FAT32 드라이브의 파일 매핑을 검색합니다.

$ MFT 파일을 직접 구문 분석 (형식에는 몇 가지 함정이 있음)하거나 FAT32 파일 할당 테이블을 디렉터리와 함께 구문 분석합니다.

전체 공유 GENERIC 읽기를 위해 FileCreate로 드라이브 (예 : 'c :')를 여는 것이 트릭입니다. 그런 다음 결과 핸들을 FileRead 및 FileSeek을 사용하여 바이트 단위로 읽을 수 있습니다. 이는 관리자 모드에서만 작동합니다 (또는 상승 된 상태).

NTFS에서 $ MFT는 조각화 될 수 있으며 부팅 섹터 정보에서 위치를 찾는 것이 약간 까다 롭습니다. 클러스터를 가져 오기 위해 C : \ $ MFT 파일에서 FSCTL_GET_RETRIEVAL_POINTERS를 사용합니다.

FAT32에서 FAT 테이블과 루트 디렉터리 파일을 포함하는 클러스터를 찾으려면 부트 섹터를 구문 분석해야합니다. 디렉토리 항목을 구문 분석하고 서브 디렉토리의 클러스터를 재귀 적으로 찾아야합니다.

+3

업데이트로 Windows 7은 한 번의 작업으로 OP가 원하는대로 수행하는 것으로 보이는 'FSCTL_LOOKUP_STREAM_FROM_CLUSTER'을 가지고 있습니다. – Damon

0

블록 #에서 파일로 O (1) 매핑 방법이 없습니다. 해당 블록을 포함하는 파일을 찾는 전체 MFT를 따라야합니다.

물론 라이브 시스템에서 데이터를 읽은 후에 오래된 데이터이므로 이동 데이터 FSCTL에서 오류를 대비해야합니다.