C# 文件正在被c中的另一个进程使用#

C# 文件正在被c中的另一个进程使用#,c#,asp.net,filestream,C#,Asp.net,Filestream,我试图删除C#中的一个文件,但收到一条消息,表示该文件是从另一个进程使用的。我想做的是检查文件是否存在并关闭它。我使用以下功能检查文件是否打开: public static bool IsFileInUse(string path) { if (string.IsNullOrEmpty(path)) throw new ArgumentException("'path' cannot be null or empty.", "path");

我试图删除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 );
}
我在文件中遇到问题。创建行,我收到消息:

文件正在被另一个进程使用

编辑:我试图使用锁定方法删除文件。我是否要删除lock语句中的文件?如何正确使用lock语句?

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

如果要删除的文件不存在,则不会引发异常

尝试检查异常

  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 );
     }
}

为什么您认为如果文件正在使用中,读取操作会失败,而写入操作不会失败
File.Create()
将失败,就像new
FileStream()

另见

请注意,如果另一个进程没有以独占方式打开该文件(检查
FileShare
枚举),您的检查将失败:文件可能会为共享读取、写入而打开,有时甚至会为删除而打开(例如,您可能可以同时读取但不能写入,但另一个进程可能允许您删除该文件…)

关闭一个打开的文件可能会对另一个进程造成真正的破坏,它可能会崩溃,很好地处理问题或…其他任何事情(悄悄地忽略该错误并产生随机输出,再次打开文件等等…)是否可以用C#完成?是的,有一些P/Invoke

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

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

3) 关闭仅创建句柄指定
复制\u Close\u SOURCE
,它将同时关闭您的句柄和原始句柄(当然,如果您的进程具有足够的权限)


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

您不能通过任何直接的方法关闭由其他进程打开的文件。因此,我应该终止进程以关闭文件,对吗?这是您的应用程序吗?如果是,则您可以发送消息以释放它或使用进程间锁。使用它的其他进程是什么?这是你的应用程序本身吗?你可以找到很多关于锁定、多线程的文章,这是msdn关于锁定的内容,我的文件正被另一个进程使用,所以我需要关闭该进程(线程)才能删除该文件。我的文件正被另一个进程使用,所以我需要关闭该进程(线程)为了删除文件。@JoseRamon您可以这样做(关闭该进程),但要小心。这是关闭线程的方法吗?