디렉토리의 하위 파일이 변경되었는지 확인하는 방법
-
09-06-2019 - |
문제
Windows에서 폴더에 변경된 하위 파일이 있는지 쉽게 알 수 있는 방법이 있습니까?
확인했는데 하위 파일이 변경되면 폴더의 마지막 수정 날짜가 업데이트되지 않습니다.
이 동작을 수정하도록 설정할 수 있는 레지스트리 항목이 있습니까?
중요한 경우 NTFS 볼륨을 사용하고 있습니다.
나는 궁극적으로 C++ 프로그램에서 이 기능을 갖고 싶습니다.
폴더가 너무 크기 때문에 전체 디렉터리를 재귀적으로 검색하는 것은 나에게 적합하지 않습니다.
업데이트:변경이 발생하는 동안 프로세스를 실행하지 않고 이 작업을 수행할 수 있는 방법이 정말로 필요합니다.따라서 파일 시스템 감시자를 설치하는 것은 나에게 적합하지 않습니다.
업데이트2:아카이브 비트도 마지막 수정 날짜와 동일한 문제가 있어서 작동하지 않게 됩니다.파일의 보관 비트가 설정되지만 폴더는 설정되지 않습니다.
해결책
이것 기사 도움이 될 것입니다.기본적으로 다음과 같은 하나 이상의 알림 개체를 만듭니다.
HANDLE dwChangeHandles[2]; dwChangeHandles[0] = FindFirstChangeNotification( lpDir, // directory to watch FALSE, // do not watch subtree FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); } // Watch the subtree for directory creation and deletion. dwChangeHandles[1] = FindFirstChangeNotification( lpDrive, // directory to watch TRUE, // watch the subtree FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir name changes if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed.\n"); ExitProcess(GetLastError()); }
그런 다음 알림을 기다립니다.
while (TRUE) { // Wait for notification. printf("\nWaiting for notification...\n"); DWORD dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, FALSE, INFINITE); switch (dwWaitStatus) { case WAIT_OBJECT_0: // A file was created, renamed, or deleted in the directory. // Restart the notification. if ( FindNextChangeNotification(dwChangeHandles[0]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break; case WAIT_OBJECT_0 + 1: // Restart the notification. if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed.\n"); ExitProcess(GetLastError()); } break; case WAIT_TIMEOUT: // A time-out occurred. This would happen if some value other // than INFINITE is used in the Wait call and no changes occur. // In a single-threaded environment, you might not want an // INFINITE wait. printf("\nNo changes in the time-out period.\n"); break; default: printf("\n ERROR: Unhandled dwWaitStatus.\n"); ExitProcess(GetLastError()); break; } } }
다른 팁
몇 가지 훌륭한 샘플 코드 이 CodeProject 기사
변경이 발생했을 때 프로세스를 실행할 수 없다면 파일 시스템을 스캔하고 수정 날짜/시간을 확인하는 것 외에는 할 수 있는 일이 많지 않습니다.하지만 이를 위해서는 각 파일의 마지막 날짜/시간을 저장하고 비교해야 합니다.
다음을 사용하면 속도를 높일 수 있습니다. 아카이브 비트 (백업 소프트웨어가 망가질 수 있으므로 신중하게 진행하십시오.)
아카이브 비트는 많은 컴퓨터 파일 시스템, 특히 FAT, FAT32 및 NTF에 존재하는 파일 속성입니다.아카이브 비트의 목적은 아카이빙이라고도하는 백업 목적으로 파일의 증분 변경을 추적하는 것입니다.
아카이브 비트는 바이너리 비트이므로 1 또는 0 이거나이 경우 더 자주 SET (1) 및 CLEAR (0)이라고합니다.운영 체제는 파일을 생성, 이동, 이름을 바꾸거나 다른 방식으로 수정할 때마다 아카이브 비트를 설정합니다.따라서 아카이브 비트는 두 상태 중 하나를 나타냅니다.마지막 백업 이후 "변경"및 "변경되지 않음".
아카이브 비트는 단순히 파일을 읽는 것도 영향을받지 않습니다.파일이 복사되면 원본 파일의 아카이브 비트는 영향을받지 않지만 사본의 아카이브 비트는 사본이 작성 될 때 설정됩니다.
따라서 프로세스는 다음과 같습니다.
- 모든 파일의 보관 비트 지우기
- 시간이 지남에 따라 파일 시스템을 변경하도록 허용
- 모든 파일 검사 - 보관 비트가 설정된 모든 파일이 변경되었습니다.
이렇게 하면 프로그램이 상태를 유지할 필요가 없어지고 디렉터리 항목(비트가 저장된 곳)만 검토하고 클러스터링되므로 매우 빨라야 합니다.
그러나 변경 중에 프로세스를 실행할 수 있다면 다음을 살펴보는 것이 좋습니다. 파일 시스템 감시자 수업.여기에 예 당신이 그것을 어떻게 사용할 수 있는지.
그것은 또한 존재합니다 .그물 (이 유형의 문제를 나중에 검색하는 사람들을 위해)
아마도 변경 사항을 감시하고 나중에 읽을 수 있도록 파일을 생성하는 프로세스를 컴퓨터에서 실행되도록 남겨 둘 수 있습니다.
-아담
아마도 설명된 대로 DeviceIoControl과 함께 NTFS 5 Change Journal을 사용할 수 있습니다. 여기
.NET 사용에 반대하지 않는다면 파일 시스템 감시자 수업에서는 이 문제를 꽤 쉽게 처리해 줄 것입니다.
이중 게시물에서 누군가 언급했습니다.WMI 이벤트 싱크
그래도 여전히 더 나은 답변을 찾고 있습니다.
쉬운 일은 없습니다. 실행 중인 앱이 있는 경우 다른 답변에서 제안한 대로 Win32 파일 변경 알림 API(FindFirstChangeNotification)를 사용할 수 있습니다.경고:2000년경 트렌드 마이크로 실시간 바이러스 스캐너는 변경 사항을 그룹화하여 파일 시스템 변경 목록을 요청할 때 매우 큰 버퍼를 사용해야 했습니다.
실행 중인 앱이 없으면 ntfs 저널링을 켜고 저널에서 변경 사항을 검색할 수 있습니다. http://msdn.microsoft.com/en-us/library/aa363798(VS.85).aspx 그러나 변경 사항 수가 파일 수보다 클 경우 전체 디렉터리를 검색하는 것보다 속도가 느려질 수 있습니다.