繁体   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