2012-01-06 50 views
6

我試圖跟蹤由用戶和其他應用程序複製的文件。 FileSystemWatch只具有更改,創建,刪除,處置,錯誤和重命名的事件。 當文件被複制函數訪問或新文件被複制到時,它不會觸發事件。C#跟蹤複製的文件

有沒有一種方法來監控窗口的複製事件/功能?

+0

你能看到剪貼板實例嗎?只是一個想法。 http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx – 2012-01-06 15:56:06

+0

如何容忍跟蹤副本失敗?您可能會追蹤_most_副本(例如通過資源管理器完成的副本),但有些會滑過。 – 2012-01-06 16:03:48

+0

你爲什麼要這麼做? – RQDQ 2012-01-06 16:38:27

回答

4

我不知道使用C#的任何方式。

如果您願意編寫File System Filter Driver,您可以這樣做。 [當然專家的領土,因爲有餘地損壞的文件和/或打倒你的系統]針對文件系統 或其他文件系統過濾驅動

一個文件系統過濾驅動攔截請求。通過在請求達到其預定目標之前攔截 請求,篩選器驅動程序可以將 請求的原始目標提供的功能擴展或替換爲 。文件系統過濾器驅動程序的示例包括防病毒 過濾器,備份代理和加密產品。要開發文件 系統和文件系統篩選器驅動程序,請使用隨Windows驅動程序工具包(WDK)提供的IFS(可安裝文件 系統)工具包。

+1

過濾器驅動程序可以跟蹤單獨的讀寫操作,但不能建立兩者之間的鏈接。無法以確定的方式識別複製。 – 2012-11-27 17:05:37

1

你在做正確的事FileSystemWatcher。 Windows沒有任何可靠的報告內置機制。

您可以掛鉤操作系統拷貝例程,但是這並不能保證您獲得好的結果:應用程序可以通過打開源文件和目標文件並複製字節來自由實現自己的副本。

重命名是不同的,因爲通過操作系統完成的重命名不能通過其他方式輕鬆模仿,因此您將使用FileSystemWatcher捕獲所有重命名。請注意,在驅動器之間移動更像是複製:您不會得到重命名通知,而是創建和刪除。

所以,如果你真的需要注意文件中獲取複製,我建議的方法是這樣的:

  • HookCloseFile電話,除了FileSystemWatcher
  • 每當文件關閉時,可能是因爲它是複製/跨驅動器移動的源或目標。檢查它的大小。
  • 如果在相當短的時間內發現兩個相同大小的封閉文件,請比較內容。資源密集程度很高,但是這是唯一可靠的方法。
0

我想不出什麼好辦法安裝程序啓動。

對於每個新創建的文件,您都需要檢查文件系統上任何位置是否存在確切的重複(可能是使用不同的名稱)。你顯然可以做這種蠻力,但解決方案將是非常不雅,緩慢和脆弱!