2

每當我訂閱FileSystemWatcher通知時,創建新文件或更改現有文件時都會發生多個事件。事件在下列序列存在的:在OpenNETCF.IO.FileSystemWatcher中發生多次事件

新文件

創建

改變

改變

改變

改變

更改

改變

變化

改變

刪除

改變

重命名

更名

刪除

刪除

重命名和刪除是否按預期工作。創建和更改被多次調用。

是否有任何解決方案/解決方法獲取確切的通知時添加/更改文件?

+0

你能發佈事件數據嗎?它不同嗎?爲事件? – 2010-10-13 04:40:19

+0

聽起來像它有類似的桌面版的陷阱:http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx。根據我的經驗,我儘量避免使用FSW。 – PaulG 2010-10-13 06:41:20

回答

3

如果您查看FSW的SDF源代碼,您會發現它實際上是一個非常簡單的SHChangeNotifyRegister調用的管理墊片,dwEventMask設置爲SHCNE_ALLEVENTS。一個窗口句柄被傳遞給API,然後在發生更改時接收回調,並將這些回調編組到FSW在受管理端展示的託管事件。

現在看回調,它看起來像有9個事件ID是手柄,其中四個提高一個Changed事件:

  • SHCNE_UPDATEDIR
  • SHCNE_RMDIR
  • SHCNE_UPDATEITEM
  • SHCNE_ATTRIBUTES

因此,當您創建一個新文件時,SHCNE_CREATE會爲您提供Created事件,follo由一些其他回調提出了幾個改變的事件。所有事件的變化事件都是一樣的嗎?如果是的話,你必須使用調試器來遍歷SDF代碼,以確切瞭解到底會發生什麼以及哪些實際的回調。

這裏的一個小故事是SDF只是轉發操作系統給它的事件。你看到所有這些事件的原因是因爲操作系統發送它們。它正在發送它們的原因可能是操作系統正在處理文件的方式,或者它甚至可能是特定於您正在使用的文件系統驅動程序(即,在另一個設備上它可能略有不同,或者甚至在另一個磁盤上相同的設備)。

我認爲這種解決方法是查看事件參數並「快速」連續發生相同文件名的事件。例如,如果您在同一個文件夾中爲同一個文件名獲得一堆Changed和一個Created事件,那麼很有可能它是一個文件創建。

+0

捕捉事件並確定一秒內發生的重複事件似乎是一種破解。有沒有更好的解決方案呢? – 2010-10-14 04:14:12