문제

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;
      }
   }
}

다른 팁

이것은 어쩌면 과잉일지도 모르지만, IFS 키트 MS 또는 FDDK OSR의 것이 대안이 될 수 있습니다.파일 시스템의 모든 변경 사항을 간단하게 모니터링하여 자신만의 파일 시스템 필터 드라이버를 만드세요.

ReadDirectoryChangesW

몇 가지 훌륭한 샘플 코드 이 CodeProject 기사

변경이 발생했을 때 프로세스를 실행할 수 없다면 파일 시스템을 스캔하고 수정 날짜/시간을 확인하는 것 외에는 할 수 있는 일이 많지 않습니다.하지만 이를 위해서는 각 파일의 마지막 날짜/시간을 저장하고 비교해야 합니다.

다음을 사용하면 속도를 높일 수 있습니다. 아카이브 비트 (백업 소프트웨어가 망가질 수 있으므로 신중하게 진행하십시오.)

아카이브 비트는 많은 컴퓨터 파일 시스템, 특히 FAT, FAT32 및 NTF에 존재하는 파일 속성입니다.아카이브 비트의 목적은 아카이빙이라고도하는 백업 목적으로 파일의 증분 변경을 추적하는 것입니다.

아카이브 비트는 바이너리 비트이므로 1 또는 0 이거나이 경우 더 자주 SET (1) 및 CLEAR (0)이라고합니다.운영 체제는 파일을 생성, 이동, 이름을 바꾸거나 다른 방식으로 수정할 때마다 아카이브 비트를 설정합니다.따라서 아카이브 비트는 두 상태 중 하나를 나타냅니다.마지막 백업 이후 "변경"및 "변경되지 않음".

아카이브 비트는 단순히 파일을 읽는 것도 영향을받지 않습니다.파일이 복사되면 원본 파일의 아카이브 비트는 영향을받지 않지만 사본의 아카이브 비트는 사본이 작성 될 때 설정됩니다.

따라서 프로세스는 다음과 같습니다.

  1. 모든 파일의 보관 비트 지우기
  2. 시간이 지남에 따라 파일 시스템을 변경하도록 허용
  3. 모든 파일 검사 - 보관 비트가 설정된 모든 파일이 변경되었습니다.

이렇게 하면 프로그램이 상태를 유지할 필요가 없어지고 디렉터리 항목(비트가 저장된 곳)만 검토하고 클러스터링되므로 매우 빨라야 합니다.

그러나 변경 중에 프로세스를 실행할 수 있다면 다음을 살펴보는 것이 좋습니다. 파일 시스템 감시자 수업.여기에 당신이 그것을 어떻게 사용할 수 있는지.

그것은 또한 존재합니다 .그물 (이 유형의 문제를 나중에 검색하는 사람들을 위해)

아마도 변경 사항을 감시하고 나중에 읽을 수 있도록 파일을 생성하는 프로세스를 컴퓨터에서 실행되도록 남겨 둘 수 있습니다.

-아담

아마도 설명된 대로 DeviceIoControl과 함께 NTFS 5 Change Journal을 사용할 수 있습니다. 여기

.NET 사용에 반대하지 않는다면 파일 시스템 감시자 수업에서는 이 문제를 꽤 쉽게 처리해 줄 것입니다.

이중 게시물에서 누군가 언급했습니다.WMI 이벤트 싱크

그래도 여전히 더 나은 답변을 찾고 있습니다.

쉬운 일은 없습니다. 실행 중인 앱이 있는 경우 다른 답변에서 제안한 대로 Win32 파일 변경 알림 API(FindFirstChangeNotification)를 사용할 수 있습니다.경고:2000년경 트렌드 마이크로 실시간 바이러스 스캐너는 변경 사항을 그룹화하여 파일 시스템 변경 목록을 요청할 때 매우 큰 버퍼를 사용해야 했습니다.

실행 중인 앱이 없으면 ntfs 저널링을 켜고 저널에서 변경 사항을 검색할 수 있습니다. http://msdn.microsoft.com/en-us/library/aa363798(VS.85).aspx 그러나 변경 사항 수가 파일 수보다 클 경우 전체 디렉터리를 검색하는 것보다 속도가 느려질 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top