文件正由 c# 中的另一个进程使用

本文关键字:另一个 进程 文件 | 更新日期: 2023-09-27 18:32:25

我正在尝试删除 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 行中遇到问题,我收到以下消息:

文件正由另一个进程使用。

编辑:我正在尝试使用锁定方法来删除文件。我是否应该删除锁定语句中的文件?如何正确使用锁定语句?

文件正由 c# 中的另一个进程使用

为什么您认为如果文件正在使用中,读取操作会失败,而写入操作不会? File.Create()会像以前失败的新FileStream()一样失败......

另请参阅 IOException:进程无法访问文件"文件路径",因为它正被另一个进程使用。

请注意,如果其他进程没有专门打开该文件(检查FileShare枚举),则检查将失败:文件可能打开以进行共享读取,写入,有时甚至可以删除(例如,您可能可以并发读取但不能写入,但是另一个进程可能允许您删除该文件......

关闭打开的文件可能会对其他进程造成真正的破坏,它可能会崩溃,很好地处理问题或......其他任何东西(静默忽略该错误并产生随机输出,再次打开文件等等......是否可以在 C# 中执行此操作?是的,有一些 P/调用...

1)让我们找到要解锁的文件的句柄。使用 NtQuerySystemInformation() 并枚举所有句柄,直到找到引用该文件的句柄。

2) 使用 DuplicateHandle() 复制该句柄以在您自己的进程中有效。

3)关闭只是创建指定DUPLICATE_CLOSE_SOURCE句柄,它将关闭您的句柄和原始句柄(当然,如果您的进程有足够的权限)。

4)检查文件是否真的关闭再次调用NtQuerySystemInformation(),如果没有,那么您可能需要直接关闭其父进程。

在您的代码中,您不会对 IsFileInUse 结果执行任何操作。

File.Create(file ).Close();也不会关闭由其他进程打开的文件。你需要关闭打开文件的进程,如果它是你自己的应用,请在尝试删除文件之前关闭文件句柄。

bool checking = IsFileInUse(file );
File.Create(file ).Close();
if (!checking) 
{
     if (File.Exists(file))
     {
            File.Delete(file );
     }
}

您无需检查该文件是否存在,只需尝试删除它:

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.
  }