簡體   English   中英

文件正在由C#中的另一個進程使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM