我想刪除/打開/編輯我的C#.Net應用程序中的一些文件。有時我得到異常,說明文件/目錄正在被另一個進程訪問。是否有方法來檢查文件/目錄是否正在訪問通過進程並嘗試從該進程中釋放該文件?如何檢查文件是否被其他進程訪問並釋放它?
回答
首先,我想有兩件事情,可以幫助你:
- 考慮打開文件
時,如果從文件中的數據只需要withing功能範圍使用的FileAccess和文件共享標誌使用建設
using(FileStream stream = File.Open(...)) { <file operations> }
這將確保該文件將被退出「使用」塊後立即關閉,而不是當FileStrea m對象由GC收集。
其次,有一種不安全的方式來獲取使用該文件的進程。它基於windows提供的調試功能。主要思想是獲取所有系統句柄並遍歷它們以找到哪些文件句柄和附加信息。這是使用我不確定記錄的函數完成的。如果您有興趣使用谷歌查找更多信息,但我不認爲這不是一個好方法。
public bool IsInUse(string path)
{
bool IsFree = true;
try
{
//Just opening the file as open/create
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
{
//we can check by using
fs.CanRead // or
fs.CanWrite
}
}
catch (IOException ex)
{
IsFree = false;
}
return IsFree;
}
string path = "D:\\test.doc";
bool IsFileFree = IsInUse(path);
有沒有其他的選擇,我的意思是檢查文件狀態,而不是進入Try catch? – Ravisha 2010-02-10 08:30:36
否。唯一的方法是嘗試訪問文件並處理IOException。
實際上,這是唯一安全的方式。假設有一個IsFileInUse()方法,並且您調用了它,它返回「nope,沒有人使用該文件」,然後您繼續訪問該文件。問題是與此同時,其他進程可能會鎖定或刪除文件。所以你需要將異常處理放在你試圖訪問文件的地方。 「通過獲取測試」模式是唯一一個100%可靠的模型。
如果一個文件正在被另一個進程使用,.NET不提供確定哪個其他進程可能的方法。我相信這需要一些非常低級的非託管代碼,儘管我可能是錯的。如果可能的話,這是一個非常低級的操作,「從該流程中釋放文件」,因爲這違反了其他流程的期望 - 例如,它認爲它被允許寫入文件,但是你已經刪除了該文件並且處理了該文件。我相信如果你不願意自願放棄它的話,你需要終止另一個過程。
- 1. 如何檢查android.hardware.Camera是否被釋放?
- 2. C#不能訪問該文件,因爲它被其他進程
- 3. 如何檢查文件是否被其他進程鎖定/使用NSIS
- 4. 如何確定文件是否被其他進程使用?
- 5. 如何,而文件是否被其它進程
- 6. 檢查對象是否被釋放
- 7. 檢查HTML按鈕是否被釋放
- 8. 如何檢測文件是否被窗口中的其他進程打開
- 9. c#如果該文件被其他進程處理,如何訪問文件?
- 10. 在Python中檢查文件是否未打開(未被其他進程使用)
- 11. 如何在Android上檢查文件是否被其他應用程序
- 12. 如何檢查文件是否被其他應用程序使用?
- 13. 如何檢查一個表數據是否在其他進程中被引用
- 14. 該文件已被其他進程訪問WebClient.FileDownlOad安寧錯誤
- 15. 由python複製的文件不能被其他進程訪問
- 16. 無法訪問已被其他進程使用的文件
- 17. 檢查excel文件是否被其他用戶打開
- 18. 如何檢查文件是否被其他進程或應用程序鎖定(windows)
- 19. 檢查文件是否被進程文件句柄鎖定
- 20. 訪問2010如何檢查是否是/否字段被選中
- 21. 如何在KeyListener中檢查Ctrl是否被釋放?
- 22. 如何檢查對象是否被釋放?
- 23. 如何檢查控制鍵是否被釋放
- 24. 等待文件被進程釋放
- 25. 如何檢查外部WPF進程或其他進程是否啓動?
- 26. 訪問其他Java進程
- 27. 如何在下載之前檢查一個zip文件是否未被其他進程使用
- 28. 如何檢查打開的文件是否已被其他進程移動或刪除
- 29. 如何在其他進程中檢查打開的文件?
- 30. 如何檢測組件是否已被釋放?
似乎足夠感謝諷刺 – Ravisha 2010-02-10 08:32:55