Windows가 설명 할 때 Windows가 작동하는 이유를 설명 하는 MSDN 블로그가 있습니다.
먼저 당신이 보는 것은 NTFS에만 있다고하자.
당신이 말한 것을 테스트하기 위해 5 초마다 파일에 40 kB를 쓰는 작은 프로그램을 작성했습니다. 파일은 모든 쓰기 사이에 열려 있습니다. 두 번째 프로그램은 FindFirstFileEx
현재 파일 크기를 얻는 데 사용 됩니다. 세 번째 dir
로 cmd.exe에서 사용 합니다. 이 설정을 사용하면 설명 내용을 정확하게 볼 수 있습니다.
이 문제의 원인은 NTFS에서 결정한 디자인 결정입니다. NTFS (유닉스 파일 시스템에서와 같이)에서 동일한 파일은 두 개의 디렉토리에있을 수 있습니다. 이것을 하드 링크라고합니다. 즉, 각각 파일에 대한 항목이있는 두 개의 디렉토리가 있고 파일 자체에 특성이있는 디렉토리가 있습니다. 파일 크기는 파일에 속하는 속성이므로 저장됩니다. 그러나 누군가 파일 크기와 같은 속성을 가진 디렉토리의 파일 목록을 원한다면 디렉토리 자체를 읽을뿐만 아니라 모든 파일의 정보를 읽는 경우 성능이 매우 저하됩니다. 한 디렉토리의 데이터는 순차적으로 저장 될 수 있지만 다른 파일의 데이터는 디스크 전체에 분산 될 수 있습니다. 따라서 NTFS는 파일 크기의 복사본을 디렉터리 항목 / 항목에 저장합니다.
당신은 그것을 추측했을 수도 있습니다, 이것은 또한 성능 적중이 있습니다. 같은 파일에 대한 약 10 개의 하드 링크를 생각하십시오. 파일에 쓸 때마다 NTFS가 10 개의 디렉토리 항목을 업데이트하도록 하시겠습니까? 따라서 Vista 이후 두 번째 디자인 결정이 내려졌습니다. 디렉토리 항목의 데이터는 파일을 닫을 때만 업데이트됩니다.
파일에 기록하고 파일을 열린 상태로 유지하는 프로그램을 실행하면 쉽게 확인할 수 있습니다. 실행 dir
하면 업데이트 된 크기가 표시되지 않습니다. 또는 메모장으로 파일을 작성하면 (끝 부분에 파일이 닫힘) 즉시 새 파일 크기가 dir
탐색기 또는 탐색기에 표시됩니다 .
F5파일 크기를 새로 고치는 데 어떻게 도움이됩니까? 탐색기 는 파일을 내부적으로 열고 닫는 GetNamedSecurityInfo 를 호출 합니다 ( SysInternals Process Monitor 에서 확인할 수 있음 ). 내가 전화하면 GetNamedSecurityInfo
내 자신의 프로그램에 다음 전화를 FindFirstFileEx
나는 즉시 새 파일 크기를 참조하십시오. 따라서 관찰 된 행동은 이론에서 예상 한대로입니다.
그러나 탐색기에서 새 파일 크기가 즉시 보이지 않는 이유는 무엇입니까? 익스플로러가 먼저 전화 FindFirstFileEx
를 한 것 같습니다 GetNamedSecurityInfo
. 따라서 탐색기가 이전 크기를 얻은 다음 디렉토리 항목 업데이트를 트리거합니다. dir
cmd.exe에서 실행 하면 디렉토리 항목에 새 파일 크기가 있음을 알 수 있습니다. 익스플로러가 아직 모르는 것입니다. 탐색기는 F5최신 크기를 얻은 다음 업데이트를 다시 트리거하는 데 1 초가 걸립니다 .
응용 프로그램 개발자의 관점에서 나는 이것이 탐색기 버그라고 생각하지 않을 것입니다-이것은 지원되는 파일 시스템 중 하나의 특별한 경우이며 응용 프로그램은 파일 시스템과 추상화되어야합니다. 그러나 탐색기가 Windows의 일부이므로 Microsoft는 더 나은 사용자 경험을 얻기 위해 더 나은 작업을 수행하고 함수 호출 순서를 변경할 수 있다고 생각하는 경향이 있습니다.
BTW, 매우 흥미로운 질문에 감사드립니다! 나는 그런 NTFS interna를 배운 것을 좋아합니다.