2012-07-03 5 views
4

내 응용 프로그램에서 현재 탐색중인 파일을 업데이트하기 위해 Windows에서 실행중인 C# 응용 프로그램에 FileSystemWatcher을 사용하고 있습니다. 로컬 디렉토리를 탐색 할 때 제대로 작동합니다. 파일 이름이 변경되거나 삭제되거나 추가 될 때 알림을받습니다.FileSystemWatcher with Linux with Samba

: 처음으로 드라이브 나 네트워크에있는 파일의 이름을 변경하는 경우 예를 들어 는 단, FileSystemWatcher 내가 같은 파일이나 다른 파일 이름을 바꿀 때 FileSystemWatcher 오류의 저를 통지 한 다음 이름 바꾸기 액션의 저를 통지하고 the specified server cannot perform the requested operation.

그런 다음 FileSystemWatcher는 아무 것도 알리지 않습니다. 때로는

내가 나에게 아무것도에 통보하지은 FileSystemWatcher 전에 두 번 이름을 바꿀 수 있습니다 ... 여기

내 테스트 코드 : 모든

static void Main(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = @"N:\prive\defFolder"; 

     watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite; 

     watcher.Changed += new FileSystemEventHandler(watcher_Changed); 
     watcher.Created += new FileSystemEventHandler(watcher_Changed); 
     watcher.Deleted += new FileSystemEventHandler(watcher_Changed); 
     watcher.Renamed += new RenamedEventHandler(watcher_Renamed); 
     watcher.Error += new ErrorEventHandler(watcher_Error); 

     watcher.EnableRaisingEvents = true; 

     Console.Read(); 
     watcher.Dispose(); 
    } 

    static void watcher_Error(object sender, ErrorEventArgs e) 
    { 
     Console.WriteLine("error : " + e.GetException().Message); 
    } 

    static void watcher_Renamed(object sender, RenamedEventArgs e) 
    { 
     Console.WriteLine("rename success"); 
    } 

    static void watcher_Changed(object sender, FileSystemEventArgs e) 
    { 
     Console.WriteLine("change success"); 
    } 
+0

당신은 당신의 클라이언트 코드가 리눅스 (예 : 모노) 또는 삼바 공유가있는 서버에서도 실행되고 있다는 것을 의미합니까? –

+0

클라이언트가 Windows 및 Linux (Ubuntu Server 10.04) – Akhilleus

+0

의 서버에서 실행되지 않습니다. 추가하려면 ... 해당 작업을 수행하기 위해 올바른 privalages를 공유에 설정 했습니까? 파일 시스템 워처에는 여기에 설명 된 사용 권한이 필요합니다. http://msdn.microsoft.com/en-us/library/aa365465%28v=vs.85%29.aspx – Nico

답변

4

첫째, 원격 공유의 파일 시스템 모니터링 항상 것입니다 다소 신뢰할 수 없다. 앱에 모든 이벤트 가져 오기를 의뢰해서는 안됩니다. 실제로, 당신이 놓친 변경 사항을 확인하기위한 백업 폴링 메커니즘을 제공 할 것을 제안합니다. GUI에있는 새로 고침 버튼은 앱에 따라 다른 옵션이 될 수 있습니다.

즉, 귀하의 특정 문제는 드문 것 같지 않습니다. 당신이 가지고있는 삼바 공유와 같은 문제가 될 것으로 보인다 그 오류 메시지 "지정된 서버가 요청 된 작업을 수행 할 수 없습니다"-

위해 일을 나타냅니다. 문제의 원인을 지적 할 수있는 Samba 로그에 Linux 서버의 로그가 있습니까?

  • 당신이 FSW 나누기,하려고하면 FSW 아래
  • 를 나누기 경우에도 폴더가 변경 얻을 할 것을 보장하는 폴링 메커니즘을 추가 즉각적인 해결 방법으로

    , 나는 당신이이 일을하려고 제안 새 것을 만들어 "다시 시작"하십시오. 오류가 발생했을 때 EnableRaisingEventsfalse으로 설정되어 있는지 확인하고 싶을 수도 있습니다. 이벤트 수신을 다시 시작하려면 true로 설정할 수 있습니다.
  • 문제가 (나는 그것을 의심하지 않지만, 그것은 총 가치)
+1

정말 고마워, 실제로 변경이 발생할 때 알림을 받아야합니다. 사용자가 열람 한 디렉토리에. 내 문제는 대부분 오류 이벤트 후에 이벤트가 손실되었습니다. 새로운 'FileSystemWatcher'를 만들면 끊임없이 파일 시스템 변경 사항을 알립니다. – Akhilleus

0
 if (Directory.Exists(monitorPath)) 
     { 
      watcher.Path = monitorPath; 
      watcher.IncludeSubdirectories = true; 
      watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime; 
      watcher.InternalBufferSize = 65536; 
      watcher.Filter = "test_prod-Pg1_ICT*"; 
      watcher.Changed += new FileSystemEventHandler(fileChangedEvent); 
      watcher.EnableRaisingEvents = true; 
      LogEvent("Folder Syncronization Service is Started!"); 

     } 

내가 모니터링하는 윈도우 서비스은 FileSystemWatcher를 기반으로 클래스를 생성의 경우에 internal buffer size 주변에 재생 해보십시오 (여기 빨대에 대한 파악) Samba 공유 폴더 onChanges와 CodeProject의 DifferenceEngine을 사용하여 차이점을 확인하고 변경 사항이있을 경우 Window Shared Folder 경로로 복사합니다. 또한 네트워크가 실패 할 때마다 처리 할 매 10 초를 확인하는 타이머를 추가했습니다. List Array가 있습니다. 변경 횟수를 저장합니다. 파일 변경 이벤트가 발생할 때 목록에 추가되고 성공하면 목록이 제거됩니다.

Window 7 Pro OS에서 두 대의 HP 노트북을 테스트 해 보았습니다.

하지만 다른 Windows 7 Pro Laptop 및 Window XP Pro SP3 Desktop에서 작업하지 못했습니다. (우리는 같은 회사 네트워크/VLAN 및 서비스 팩에 있습니다)

내가 삼바 공유 폴더에서 뭔가를 수정하면, 그것은 최신 내용을 창 공유 경로와 동기화하지 못합니다.

또한 추가 한 다음

[PermissionSetAttribute (SecurityAction.LinkDemand 이름 = "완전 신뢰")]의 상부에 [PermissionSetAttribute (SecurityAction.InheritanceDemand 이름 = "완전 신뢰")]

코딩, 작동하지 않는 것 같습니다