2014-04-09 5 views
0

특정 파일이 끝나는 새 파일을 만들려면 특정 디렉토리를 관찰해야합니다 (예 : .txt).새로 생성 된 파일의 디렉토리를 안정적으로 관찰하는 방법은 무엇입니까?

기본 운영 체제 (Windows/Linux) 또는 NFS 공유에 액세스하거나 Samba 공유 또는 로컬 디렉토리에 관계없이 작동해야합니다.

ThreadPool.QueueUserWorkItem(new WaitCallback(delegate { HandleFile(e.FullPath); })); 

문제는이 모든 파일을 선택하지 않는다는 것입니다 :

는 처음에는 단지은 FileSystemWatcher

WatcherForPathToWatch_Created의
watcherForPathToWatch = new FileSystemWatcher(folderToWatch, "*.rdy"); 
watcherForPathToWatch.Created += WatcherForPathToWatch_Created; 
watcherForPathToWatch.Error += WatcherForPathToWatch_Error; 
watcherForPathToWatch.IncludeSubdirectories = false; 
watcherForPathToWatch.EnableRaisingEvents = true; 

내용을 사용했다. NTFS 파티션의 로컬 디렉토리에서도 파일이 처리되지 않는 경우가 있습니다.

그래서 그것에 대해 너무 많이 생각하지 않고 몇 분마다 DirectoryEnumeration을 수행하면 문제가 해결 될 것이라고 생각했습니다. 이 모양은 다음과 같습니다.

 private void EnumerationBasedArchiving() 
     { 
      watcherForPathToWatch.EnableRaisingEvents = false;     
      int maxThreads; 
      int unneeded; 
      int currThreads; 
      do 
      { 
       Thread.Sleep(500); 
       ThreadPool.GetMaxThreads(out maxThreads, out unneeded); 
       ThreadPool.GetAvailableThreads(out currThreads, out unneeded); 
      } while ((maxThreads - currThreads) != 0); 
      List<string> listOfFilesToArchive = null; 
      do 
      { 
       try 
       { 
        Directory.EnumerateFiles(folderToWatch, "*.txt", SearchOption.TopDirectoryOnly).ToList(); 
       } 
       catch (Exception ex) 
       { 
        //error logging happens here, too 
        Thread.Sleep(10000); 
       } 
      } while (listOfFilesToArchive == null); 
      watcherForPathToWatch.EnableRaisingEvents = true; 
      Parallel.ForEach(listOfFilesToArchive, (fileToArchive) => { HandleFiles(fileToArchive); }); 
     } 

이 접근법의 문제점은 대부분의 상황에서 작동해야하지만 너무 안정적이지 않습니다. 특히 디렉터리의 내용을 열거하고 처리기를 다시 전환하는 시점. 이 두 지점 사이에 정확히 만들어진 파일이있는 경우 다음 열거 사이클까지 처리하지 않겠습니다.

이제 '최상의'솔루션이 FileSystemWatcher를 완전히 무시할 수 있는지, 또는 어떻게하면 더 안정적으로 만들 수 있는지 궁금합니다. 생성 된 순서대로 파일을 처리하는 것이 중요합니다.

+0

"특히 디렉토리 내용을 열거하고 핸들러를 다시 전환하는 시점 "- 처리기를 끄지 않고 코드의 중복 된 알림에 대처할 수 있습니까? – Rup

+0

아마도. 그러나 FileSystemWatcher 항목을 버리는 것은 훨씬 쉽습니다. 왜 내가 전에 그것을 보지 못했는지 모르겠다./ –

답변

1

리눅스 described hereinotify 있습니다,하지만 당신은 Windows 및 Linux 및 NFS 및 삼바를 다루고 아무것도 얻을 수 없습니다, 그래서 당신은 아마 자신의 압연 을 끝낼 것입니다.

파일을 만든 순서대로 처리하는 것이 중요하다고 말했죠 ... "잘못된"순서로 파일을 찾을 수 있기 때문에 파일을 처리하지 못할 수도 있습니다. 각각의 파일에는 타임 스탬프가 있으므로 파일을 찾은 순서와 다른 순서로 처리 할 수 ​​있습니다. 물론, 그 사이에 지연을 코딩하여 실제로 처리 할 때가 있지만 폴링 간격이 올바르다면 ...

+0

예, Inotify에 대해 알게되고 모노로 구현 한 후에 FileSystemWatcher 항목을 코딩했다. 나는 네트워크 공유가 지원되는지보기 위해 귀찮게하지 않았다. 지연/수동 분류에 관해서 : 네, 그런 것 같아요. 내가 FileSystemWatcher 물건을 던질 것 같아요. –