2009-12-12 5 views
3

이 질문은이 주제에 따라된다 : 난 그냥 XP/Vista에서 fsutil.exe를 확인 creating a huge dummy file in a matter of seconds in c#왜 fsutil.exe는 프로그램 적으로 디스크에 거대한 파일을 기록하는 데 시간이 덜 걸리는가?

은/일곱 저장 디스크에 더미 데이터의 엄청난 금액을 작성하고 그것을 작성하는 시간이 덜 걸립니다 같은 큰를 파일을 프로그래밍 방식으로 비교합니다.

나는 그것이 fsutil.exe

노트보다 훨씬 더 많은 시간이 걸릴 것 그물의 도움으로 같은 일을 할 노력하고있어 때 나는 그물이 그 bcuz 네이티브 코드를 사용하지 않는 것을 알고있다 방금 다음과 같이 기본 API로이 문제를 확인했습니다.

long int size = DiskFree('L' - 64); 
const char* full = "fulldisk.dsk"; 
__try{ 
Application->ProcessMessages(); 
HANDLE hf = CreateFile(full, 
         GENERIC_WRITE, 
         0, 
         0, 
         CREATE_ALWAYS, 
         0, 
         0); 
SetFilePointer(hf, size, 0, FILE_BEGIN); 
SetEndOfFile(hf); 
CloseHandle(hf); 
}__finally{ 
    ShowMessage("Finished"); 
    exit(0); 

답변은 .net 결과와 동일합니다. 40 초 같은 양 ~이 소요됩니다 .NET을 4백메가바이트을을 writting에 대한 :

하지만 fsutil.exe의 도움으로 그것은 단지 위 또는 .net 방식보다 적은 시간을 소요

는 2 회 예를 빠른 말 fsutil.exe는 약 20 초 정도 걸립니다.

여기에 대한 설명이 있습니까? 또는 fsutil.exe가이 중요 속도를 쓰는 함수를 사용합니까?

답변

5

나는 fsutil이 무엇을하고 있는지 정확하게 모르고 있지만 위의 작업보다 더 빠른 큰 파일을 작성하는 두 가지 방법을 알고있다. (또는 원하는 길이를 찾고 0을 쓰면, 동일한 결과를 가짐).

이러한 접근법의 문제점은 쓰기를 할 때 파일을 0으로 채우는 것입니다.스파 스 파일을 생성

  1. : 당신이 중 하나에 의해 제로 채우기를 피할 수

    . 크기는 원하는 위치에 표시되어 있지만 데이터는 실제로 디스크에 기록 할 때까지 디스크에 존재하지 않습니다. 기록되지 않은 영역을 모두 읽으면 0이 반환됩니다.

  2. SetFileValidData 기능을 사용하여 파일을 먼저 0으로 설정하지 않고 유효한 데이터 길이를 설정하십시오. 그러나 잠재적 인 보안 문제로 인해이 명령을 사용하려면 향상된 사용 권한이 필요합니다.
+1

"holey"파일이라는 용어는 "스파 스"이다. –

+0

나는 항상 holey를 선호 해왔다. (그것은 원래 유닉스 용어 인 way-back-when이다.) 그러나 나는 그것을 pedants를 위해 희소하게 바꾸었다. – RickNZ

1

이 어셈블러 (원시 눈을 멀게하는 속도)로 작성된

  • 이 될 수있는 일입니다
  • 네이티브 C/C++이 또는 어떤 트릭을 할이
  • 아마도 문서화되지 않은 시스템 호출을 수행하는 코드 어디에도 문서화되어 있지 않습니다.

위의 세 가지 요소는 큰 의미를 가질 수 있습니다. 생각하면 .NET 코드가로드 될 때 런타임에 의해 jit'ted가됩니다. (그렇다면 시간 요인은 눈에 띄지 않을 것입니다. 당신은 타오르는 빠른 기계를 가지고 있습니다 - 낮은 온도의 펜티엄에서는 눈에 띄게 느리게 움직일 것입니다.)

아마도 C/C++로 작성되었을 수도 있습니다. 어셈블러에서 작성된 것이라면 놀랄 수도 있습니다.

직접 확인할 수 있습니다. 실행 파일의 파일 크기를보고 .NET 실행 파일과 비교하십시오. 당신은 그 파일이 압축되어 있다고 주장 할 수도 있습니다. 나는 그것을 의심 할 것이고 따라서 이것을 배제하려는 경향이 있습니다. 마이크로 소프트는 압축 된 실행 파일 사업으로 생각하지 않을 것입니다.

희망 사항이 질문에 대한 답변을 안녕하십니까, Tom.

1

fsutil하지 FAT32에서 NTFS와 exFAT에, FAT16 에만 빠르다이 일부 파일 시스템이 "초기화 크기"concespt이 때문에 빠른 파일 초기화를 지원하기 때문이다. 이것은 파일 시스템에 파일에 기록 된 데이터가없고 유효한 읽기가 모두 00으로 채워진 버퍼를 반환하기 때문에 클러스터를 예약하지만 0으로 만들지는 않습니다.

2

나는 마지막 의견에 동의합니다. 미니 필터 드라이버를 실험하고 콜백에서 IRP_MJ_WRITE IRP를 캡처하고있었습니다. 작성 또는 cmd 행 또는 win32 응용 프로그램에서 파일에 쓸 때 쓰기 내려 오는 볼 수 있습니다. 그러나 "fsutil file createnew ..."명령을 사용하여 파일을 만들었을 때 어떤 기록도 표시되지 않습니다. NTFS 볼륨의 win2k8 r2에서이 동작을보고 있습니다. 그리고 나는 (100 % 확실하지는 않지만) 그것도 희소 한 파일이라고 생각하지 않는다. 아마도 클러스터를 할당하지 않고 MFT에서 크기 속성을 설정하고있을 것입니다. fsutil은 사용 가능한 여유 공간을 확인하므로 파일 크기가 디스크의 여유 공간보다 큰 경우 오류 1이 발생합니다.

또한 파일에 FSCTL_GET_RETRIEVAL_POINTERS를 실행하는 프로그램을 실행 했으므로 전체 파일. 그러나 나는 그것이 모든 데이터를 얻고 있다고 믿는다.