2015-11-30 20 views
0

我使用下面的代碼從here實踐FileSystemWatcher.Changed事件觸發多次。它可以很好地與.txt擴展名一起正常工作,但輸出結果不像我使用 .pdf時看到的那樣。它觸發一個「創建」事件和多個「更改」事件。WatchFolder事件上的副本文件

using System; 
using System.IO; 
using System.Security.Permissions; 

public class Watcher 
{ 

    public static void Main() 
    { 
     Run(); 

    } 

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
    public static void Run() 
    { 
     string[] args = System.Environment.GetCommandLineArgs(); 

     // If a directory is not specified, exit program. 
     if (args.Length != 2) 
     { 
      // Display the proper way to call the program. 
      Console.WriteLine("Usage: Watcher.exe (directory)"); 
      return; 
     } 

     // Create a new FileSystemWatcher and set its properties. 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = args[1]; 
     /* Watch for changes in LastAccess and LastWrite times, and 
      the renaming of files or directories. */ 
     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
     // Only watch text files. 
     watcher.Filter = "*.pdf"; 

     // Add event handlers. 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.Created += new FileSystemEventHandler(OnChanged); 
     watcher.Deleted += new FileSystemEventHandler(OnChanged); 
     watcher.Renamed += new RenamedEventHandler(OnRenamed); 

     // Begin watching. 
     watcher.EnableRaisingEvents = true; 

     // Wait for the user to quit the program. 
     Console.WriteLine("Press \'q\' to quit the sample."); 
     while (Console.Read() != 'q') ; 
    } 

    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     // Specify what is done when a file is changed, created, or deleted. 
     Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); 
    } 

    private static void OnRenamed(object source, RenamedEventArgs e) 
    { 
     // Specify what is done when a file is renamed. 
     Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); 
    } 
} 

下面是輸出的時候我一個PDF文件複製到文件夾看:

File: c:\test\innovation.pdf Created 
File: c:\test\innovation.pdf Changed 
File: c:\test\innovation.pdf Changed 
File: c:\test\innovation.pdf Changed 
File: c:\test\innovation.pdf Changed 

任何想法,爲什麼出現這種情況?

+0

因爲文件大小/屬性改變,而在複製文件。 https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.onchanged(v=vs.110).aspx - 根據文檔,使用NotifyFilter屬性來限制事件數 –

回答

0

感謝Ahmed Ilyas。所有我需要做的是改變:

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

watcher.NotifyFilter = NotifyFilters.FileName; 
+0

雖然這是正確的,但並不能解釋txt和pdf之間的區別。 – TaW