[英]File is being used by another process in c#
我正在嘗試刪除C#中的文件,但是我收到一條消息,指出該文件已被另一個進程使用。 我要做的是檢查文件是否存在並關閉它。 我正在使用以下功能來檢查文件是否打開:
public static bool IsFileInUse(string path)
{
if (string.IsNullOrEmpty(path))
throw new ArgumentException("'path' cannot be null or empty.", "path");
try
{
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { }
}
catch (IOException)
{
return true;
}
return false;
}
我正在嘗試使用文件關閉它時:
bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (File.Exists(file))
{
File.Delete(file );
}
我在File.Create行中遇到問題,我收到消息:
文件正在由另一個進程使用。
編輯:我正在嘗試使用鎖定方法以刪除文件。 我是否應該刪除lock語句中的文件? 如何正確使用lock語句?
您為什么假設如果正在使用文件而沒有使用寫入操作,則讀取操作將失敗? File.Create()
將完全像新FileStream()
之前失敗一樣失敗。
另請參見IOException:該進程無法訪問文件“文件路徑”,因為它正在被另一個進程使用 。
請注意,如果其他進程未專門打開該文件,則檢查將失敗(請檢查FileShare
枚舉):該文件可能已打開以進行共享的讀取,寫入,有時甚至是刪除(例如,您可以同時讀取但不能寫入)但是其他過程可能會讓您刪除該文件...)。
關閉打開的文件可能會對其他過程造成破壞,可能會崩潰,很好地解決問題或其他任何問題(靜默忽略該錯誤並產生隨機輸出,再次打開文件等)。可以用C#做到嗎? 是的,有一些P / Invoke ...
1)讓我們找到您想要解鎖的文件的句柄。 使用NtQuerySystemInformation()
並枚舉所有句柄,直到找到引用該文件的句柄為止。
2)使用DuplicateHandle()
復制該句柄在您自己的進程中有效。
3)關閉只是創建指定DUPLICATE_CLOSE_SOURCE
句柄,它將同時關閉您的句柄和原始句柄(當然,如果您的進程具有足夠的權限)。
4)檢查文件是否真的關閉,再次調用NtQuerySystemInformation()
,否則,您可能需要直接關閉其父進程。
您無需檢查文件是否存在,只需嘗試將其刪除 :
https://msdn.microsoft.com/en-us/library/system.io.file.delete(v=vs.110).aspx
如果要刪除的文件不存在,則不會引發異常。
嘗試檢查異常
try {
File.Delete(file);
}
catch (IOException) {
// File in use and can't be deleted; no permission etc.
}
在代碼中,對IsFileInUse結果不執行任何操作。
這個File.Create(file ).Close();
也不會關閉由另一個進程打開的文件。 您需要關閉打開文件的進程,如果它是您自己的應用程序,請在嘗試刪除文件之前關閉文件句柄。
bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (!checking)
{
if (File.Exists(file))
{
File.Delete(file );
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.