2014-03-04 21 views
0

我需要調用一個函數來確定是否調用Delete函數之前它的文件夾或文件。在刪除Windows之前調用一個函數

我正在使用File Watcher來了解我的默認文件夾內所做的所有更改。 我需要使用路徑來刪除項目的類型(文件或文件夾)。 但由於文件夾/文件已被刪除,因此文件/文件夾已被刪除,導致路徑出錯(無法找到路徑!)。

有沒有一種方法可以在使用File Watcher或任何其他方法刪除項目之前刪除項目的類型?

這是用於確定文件或文件夾的函數。該函數在文件監視器中的刪除事件(filewatcher.Deleted)中調用。

private static bool IsDirectory(string path) 
{ 
    System.IO.FileAttributes fa = System.IO.File.GetAttributes(path); 
    bool isDirectory = false; 
    if ((fa & FileAttributes.Directory) != 0) 
    { 
     isDirectory = true; 
    } 
    return isDirectory; 
} 

希望我的問題已經夠清楚了!提前致謝!

回答

1

TL; DR:這不可能以任何合理簡單的方式完成,但是您可以通過做一些「足夠相似」的工作來解決它。

您無法直接使用託管代碼執行此操作,因爲FileSystemWatcher僅對已做出的更改作出反應,此時該文件已被刪除,並且無法查詢有關它的信息。

理論上,您可以通過編寫一個DLL並將其注入到所有可能會刪除您感興趣的文件的進程中,從而在非託管代碼中實現此功能;該DLL會掛鉤相應的Win32函數 - 一個不錯的選擇是(未記錄的)NtSetFileInformation這是在刪除文件時調用的最低級函數 - 並且在刪除發生之前檢索您感興趣的信息。當然,這將會非常困難並且非常複雜,所以在實踐中它可能根本不是一種選擇。

您可能想要嘗試的解決方法是緩存有關目錄內容的信息(例如,記住其中存在的所有子目錄),然後檢索「是否是目錄?」來自您的緩存的信息。如果這就是你所需要的,並且你可以容忍一個虛假的消極情緒,那麼它應該相當容易實現。

+0

非常感謝!是否有可能阻止Windows中的默認刪除功能,並從我的應用程序中調用刪除功能?(在通過您的答案後提出此問題:)) – user3222297

+0

@ user3222297:*純理論上*它可能(不確定),但它仍然會涉及將代碼注入到所有要修改的進程中,並且您必須爲自己的應用程序提供通信通道,編寫實際上是服務器的內容等等。你*真的*不想去那裏。 – Jon

相關問題