2011-02-28 2 views
0

네트워크의 디렉터리에서 파일을 모니터링했습니다. 처음에는 FileWatcher를 사용하여 모니터했습니다. FileWatcher를 사용하는 동안 파일이 잠겨있는 것을 발견 했으므로 DirectoryInfo를 사용하여 내가 본 디렉토리에서 새로 도착한 파일과 삭제 된 파일을 감시하도록 구현을 변경했습니다. DirectoryInfo를 사용하는 동안 시계 디렉토리의 파일이 잠기므로 파일을 다운로드 한 후 다른 응용 프로그램에서 파일을 삭제할 수 없습니다. 내 시계 응용 프로그램은 Windows 서비스입니다.DirectoryInfo를 사용하는 동안 감시 디렉터리의 파일이 잠겨졌습니다.

아무도 그들이 문제에 직면했는지, 그들이 가지고 있다면, 어떻게 해결했는지 알려 줄 수 있습니까?

감사합니다.

+1

없이 "나는 파일이 FileWatcher을 사용하는 동안 잠긴 것을 발견했다"- 아닌 것 같습니다 .... filewatcher를 통해 모니터링하면서 –

+0

당신이 파일을 처리하고 있습니다. 응용 프로그램에서 정상적으로 파일 핸들을 닫아야합니다. –

+0

코드 게시 - 새 파일을 만들 때 무엇을합니까? – VinayC

답변

1

파일을 만들고 업데이트하는 작업이 완료 되었습니까? 그렇지 않으면 파일이 잠길 것입니다.

+0

2 개의 파일 (크기 1KB, 크기 67MB 중 하나)을 생성하고이를 n/w 폴더에 저장하는 프로세스 A가 있습니다. 이러한 파일은 다운로드되고 나중에 4-5 시간 후에 다른 프로세스 B에 의해 삭제됩니다. 내 응용 프로그램은 파일이 도착할 때부터 파일이 삭제 될 때까지 폴더를 확인하고 파일이 삭제되면 응용 프로그램은 파일이 삭제되었다는 알림을 보냅니다. 프로세스 B는 작은 크기의 파일을 다운로드하고 삭제할 수 있지만 큰 파일은 항상 삭제 문제가 있음을 알게되었습니다. 나는 어떤 파일도 처리하고 있지 않다. – Researcher

0

비록 FileWatcher가 UNC 공유에서 작동한다고해도, 나는 수많은 문제점을 가지고 있습니다. 문제가 시간에 중요한 문제가 아니기 때문에 파일이 있는지 확인하는 스레드를 만들고 경고가 전송 될 때까지 파일이 사라질 때까지 잠시 루프를 잠자 게됩니다.

NB : 서비스로 실행하면 실행중인 사용자가 원격 공유에 대한 네트워크 권한도 필요합니다.

업데이트 : 네트워크에서 빠른 테스트를 수행했습니다. Windows 2008 R2를 실행하는 Windows 7 서버를 실행하는 클라이언트. 공유에 크고 작은 파일을 여러 개 추가했습니다. 코드가 실행되는 동안 파일을 삭제하는 데 문제가 없었습니다. 심지어 Thread.sleep를

 bool filesDeleted = false; 

     while (!filesDeleted) 
     { 
      DirectoryInfo di = new DirectoryInfo(@"\\server\share\path\"); 
      FileInfo[] files = di.GetFiles(); 

      foreach (var file in files) 
      { 
       DateTime created = file.CreationTime; 
       string fileName = file.Name; 

       //Do what every you need to check if the two files are still there 
      } 

      Thread.Sleep(5000); 
     } 

     //Send alert 
+0

응용 프로그램이 실행되는 방식입니다. 파일을 검사하고, 잠자기 상태가되고, 파일을 다시 검사합니다. Windows 서비스에는 네트워크 권한이 있으며 파일 중 하나가 삭제되었음을 알 수 있습니다. 그러나 파일을 삭제하는 응용 프로그램은 2 개의 파일 중 큰 파일을 삭제할 수 없습니다. 감시자 응용 프로그램이 실행되는 동안 파일에 잠금이 설정되어있는 것으로 보입니다. watch 디렉토리의 "finfFileList = DirectoryInfo.getFiles()"에 이어 "finfFileList.creationtime"에 대한 후속 액세스가 발생하면 내가보고있는 파일에 잠금을 설정합니까? – Researcher

+0

아 죄송합니다. FileSystemWather 클래스를 사용했지만. 나는 그것들에 어떤 자물쇠도 두어서는 안된다고 생각하지만 색인 서비스 나 바이러스 백신은 파일을 검사 할 수 있습니다. 큰 ISO 이미지 파일을 삭제하는 데 비슷한 문제가 발생했습니다. 필자의 경우 폴더 (고급 속성)에서 "파일 및 폴더를 인덱싱 할 수 있도록 허용"속성을 제거하면 해결됩니다. – Paaland

+0

감시자 응용 프로그램이 실행되고 있지 않을 때 파일을 다운로드하고 삭제할 수 있습니다. 감시자 응용 프로그램이 실행되고 디렉토리를 감시 할 때만 파일에 잠금이 설정되고 파일을 다운로드하는 응용 프로그램에서 파일을 삭제할 수 없으며 나중에 실제로 폴더에서 파일을 수동으로 삭제해야합니다. – Researcher