2012-12-04 27 views
2

我有一個Windows服務(並通過創建一個類似的WinForms應用程序驗證代碼)NotifyFilter不起作用。只要我刪除了這行代碼,服務就可以正常工作,並且我可以在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

我也一直有這種行爲的麻煩。如果您通過代碼(如果你看MSDN documenation,你會發現,NotifyFilter開始了與默認值爲:

NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite 

所以,當你說.NotifyFilter = NotifyFilters.CreationTime,你消滅了那些其它的值,這也解釋了行爲的差異。我不知道爲什麼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