2010-11-20 108 views
3

我已經設法使用FileSystemWatcher查看文件和文件夾更改。C#文件/文件夾監視器

我的問題是我無法區分文件和文件夾。文件和文件夾可能具有相同的路徑名稱。

對於刪除事件,我甚至不能在測試File.Exists(path)或Directory.Exists(path)時使用髒的workarround,因爲調用該方法時文件/文件夾已被刪除。

也許這個對象有我需要的信息,但我沒發現它:

FileSystemEventArgs e 

我只是想知道,如果改變的項目是一個文件或文件夾。

回答

1

我已經找到了解決方案,它是乾淨的並始終有效:

觀察者的標準設置用於文件和文件夾。這在我看來是沒有意義的,因爲我找不到變化對象具有哪種類型。

可以創建兩個filewatchers。一個用於文件,一個用於文件夾。然後,您只需更改默認設置,如下所示:

// for file 
fileSysWatchFile.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite; 
// for folder 
fileSysWatchDir.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.LastWrite; 
+0

唯一的問題是FSW使用ThreadPool,所以如果你使用多個觀察者,那麼你將處理的事件的順序可能不會反映現實。到目前爲止我發現的唯一解決方案是使用ho1提到的Change Journals,或者使用[this]編寫自己的FileSystemWatcher(http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw.html )和[this](http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw_19.html)。只要將它扔到那裏,任何人誰將來會通過這個線程。 – Paya 2012-09-23 00:49:55

1

你可以測試它是否有目錄attribute

var attributes = File.GetAttributes(@"c:\somepath"); 
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory) 
{ 
    // it's a directory 
} 
else 
{ 
    // it's a file 
} 

當然,如果它已經被刪除,這是不行的,你將無法告訴的類型。

+0

您確定在OP會突出顯示文件/目錄被刪除的位置的情況下可以使用嗎? – 2010-11-20 21:13:29

+0

不,如果它已被刪除,這將不起作用。 – 2010-11-20 21:14:18

+0

如果目錄/文件已被刪除,則失敗。 – jason 2010-11-20 21:15:15

0

除非在查找刪除項目的最後一種類型之前有一個path-> type映射列表,否則無法檢索已刪除項目的類型。

+0

??? ...因此,如果我有一個文件= C:\名稱和一個文件夾= C:\名稱,我找不到哪個更改? – fpdragon 2010-11-20 21:33:29

+1

您不能在同一個文件夾中擁有同名的文件和目錄。 – ThiefMaster 2010-11-20 21:39:58

+0

無論如何,如果它已經被刪除,你甚至不能找出它是否是一個文件或目錄 – fpdragon 2010-11-20 21:46:49