2012-12-04 2 views
2

NotifyFilter가 작동하지 않는 Windows 서비스가 있고 (유사한 WinForms 응용 프로그램을 만들어 코드를 확인했습니다.) 해당 코드 줄을 제거하자마자 서비스가 제대로 작동하고 WinForms 응용 프로그램에서 이벤트 처리기가 작동하는 것을 볼 수 있습니다.FileSystemWatcher의 NotifyFilter가 작동하지 않습니다.

내가하고있는 일은 텍스트 파일을 FileSystemWatcher의 입력 디렉토리에 놓아서 watcher_FileChanged 대리자를 시작하는 것입니다. 거기에 _watcher.NotifyFilter = NotifyFilters.CreationTime;이있을 때 작동하지 않습니다. 내가 꺼내면 잘 작동합니다.

내가이 필터에 문제가 있다면 누구에게 말해 줄 수 있습니까?

다음은 OnStart 이벤트의 FSW 코드입니다.

protected override void OnStart(string[] args) 
{ 
    _watcher = new FileSystemWatcher(@"C:\Projects\Data\Test1"); 

    _watcher.Created += new FileSystemEventHandler(watcher_FileChanged); 
    _watcher.NotifyFilter = NotifyFilters.CreationTime; 
    _watcher.IncludeSubdirectories = false; 
    _watcher.EnableRaisingEvents = true; 
    _watcher.Error += new ErrorEventHandler(OnError);  
} 

private void watcher_FileChanged(object sender, FileSystemEventArgs e) 
{ 
    // Folder with new files - one or more files 
    string folder = @"C:\Projects\Data\Test1"; 
    System.Console.WriteLine(@"C:\Projects\Data\Test1"); 
    //Console.ReadKey(true); 

    // Folder to delete old files - one or more files 
    string output = @"C:\Temp\Test1\"; 
    System.Console.WriteLine(@"C:\Temp\Test1\"); 
    //Console.ReadKey(true); 

    // Create name to call new zip file by date 
    string outputFilename = Path.Combine(output, string.Format("Archive{0}.zip", DateTime.Now.ToString("MMddyyyy"))); 
    System.Console.WriteLine(outputFilename); 
    //Console.ReadKey(true); 

    // Save new files into a zip file 
    using (ZipFile zip = new ZipFile()) 
    { 
     // Add all files in directory 
     foreach (var file in Directory.GetFiles(folder)) 
     { 
      zip.AddFile(file); 
     } 

     // Save to output filename 
     zip.Save(outputFilename); 
    } 

    DirectoryInfo source = new DirectoryInfo(output); 
    // Get info of each file into the output directory to see whether or not to delete 
    foreach (FileInfo fi in source.GetFiles()) 
    { 
     if (fi.CreationTime < DateTime.Now.AddDays(-1)) 
      fi.Delete(); 
    } 
} 

답변

3

나는이 동작에도 문제가 있습니다. 당신이 .NotifyFilter = NotifyFilters.CreationTime 말할 때, 당신이 그 다른 값을 닦아하고

NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite 

: 당신이 코드를 단계별 경우 MSDN documenation 보면 (그리고, 당신은 NotifyFilter가 기본값으로 시작합니다 찾을 수 있습니다 어떤 행동의 차이를 설명합니다. 내가 왜 NotifyFilters.CreationTime 새 파일을 잡는되지 않습니다 ... 잘 모르겠어요 그것은해야한다, 그렇지 않아야한다!

만약 그것이 작동한다면 아마도 NotifyFilter에 대한 기본값을 사용할 수 있습니다 NotifyFilters.CreationTime을 추가하려면 다음과 같이 새 값을 추가하고 기존 값을 바꾸지 않는 것이 좋습니다.

_watcher.NotifyFilter = _watcher.NotifyFilter | NotifyFilters.CreationTime; 
+1

파일 내용 변경을 잡으려면'NotifyFilters.LastWrite' 외에도'NotifyFilters.Attributes'를 감시해야합니다. 다른 속성 기반 알림 ('CreationTime','Size' 등)에 대해서도 마찬가지입니다. –

0

이 게시물은 오래되었지만 파일 작성 시간이 항상 신뢰할만한 것은 아님을 알고 있습니다. 로그 파일을 보관 폴더로 옮기고 동일한 이름의 새 파일을 만든다는 문제가 발생했지만 파일 생성 날짜는 변경되지 않았습니다. 사실 메타 데이터는 이전 파일에서 유지되었습니다. 아카이브로 옮겨진 파일).

Windows에는 파일의 특정 속성에이 캐시가 있으며 파일 작성 날짜가 포함됩니다. 이 기사는 https://support.microsoft.com/en-us/kb/172190에서 읽을 수 있습니다.