2015-09-09 25 views
1

我已經編寫了用於觀察系統中的文件的這段代碼,但它沒有提示文件夾或文件中的任何修改。我怎樣才能做到這一點?我不理解,因爲它沒有顯示任何例外或錯誤。檢查C#中的文件系統觀察器

static void Main(string[] args) 
{ 
    FileSystemWatcher(); 
} 

public static void FileSystemWatcher() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = @"D:\watcher"; 
    watcher.NotifyFilter = NotifyFilters.LastWrite; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
    Console.Read(); 
} 
private static void OnChanged(object sender, FileSystemEventArgs e) 
{ 
    Console.WriteLine(e.Name + " has changed"); 
} 
+4

你確定了'Changed'事件是你想要的一個?它只會監視文件何時更改,而不是何時創建,刪除或重命名。 [這是一個事件列表。](https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher_events(v = VS.110).aspx) –

+0

@DaveZych是否有可能實現這兩個,因爲我想在文件夾中只有一個XML文件,它會隨時更改。在這裏我可以檢查我有一個新的額外的XML文件? – Abb

+1

正如@DaveZych所建議的,還有更多的事件。爲'Created'事件添加事件處理程序,以在創建文件時通知用戶。 – Melvin

回答

3

我更新了代碼。該NotifyFilter需要擴大,如果你想看到新的文件添加

static void Main(string[] args) 
    { 
     FileSystemWatcher(); 
    } 

    public static void FileSystemWatcher() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = @"D:\temp"; 
     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
    | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
     watcher.Filter = "*.*"; 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.Created += Watcher_Created; 
     watcher.Renamed += Watcher_Renamed; 
     watcher.EnableRaisingEvents = true; 
     Console.Read(); 
    } 

    private static void Watcher_Renamed(object sender, RenamedEventArgs e) 
    { 
     Console.WriteLine(e.Name + " has been renamed"); 
    } 

    private static void Watcher_Created(object sender, FileSystemEventArgs e) 
    { 
     Console.WriteLine(e.Name + " has been added"); 
    } 

    private static void OnChanged(object sender, FileSystemEventArgs e) 
    { 
     Console.WriteLine(e.Name + " has changed"); 
    } 
+0

您是如何檢查的?通過更改文件的內容?如果在哪行代碼? – Abb

+1

運行您的代碼,在臨時目錄中打開一個文件並向其中添加數據。它立即通知我 – Joe

+0

是的,它只有當我打開一個文件並更改內容並保存時才起作用。它只在保存文件時觸發。有沒有辦法檢查創建警報的新文件? – Abb

2

FileSystemWatcher.NotifyFilter Property

watcher.NotifyFilter <- is flag enum! 

你需要寫:

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

... 
watcher.Changed += new FileSystemEventHandler(OnChanged); 
watcher.Created += new FileSystemEventHandler(OnChanged); 
watcher.Deleted += new FileSystemEventHandler(OnChanged); 
watcher.Renamed += new RenamedEventHandler(OnRenamed); 
+0

是的,謝謝它的工作。 – Abb

+2

謝謝MrDywar,這是正確的答案。我更新了我上面的@Abhishek代碼示例 – Joe