C# 文件正在被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");
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()
将失败,就像newFileStream()
在
另见
请注意,如果另一个进程没有以独占方式打开该文件(检查FileShare
枚举),您的检查将失败:文件可能会为共享读取、写入而打开,有时甚至会为删除而打开(例如,您可能可以同时读取但不能写入,但另一个进程可能允许您删除该文件…)
关闭一个打开的文件可能会对另一个进程造成真正的破坏,它可能会崩溃,很好地处理问题或…其他任何事情(悄悄地忽略该错误并产生随机输出,再次打开文件等等…)是否可以用C#完成?是的,有一些P/Invoke
1) 让我们找到要解锁的文件的句柄。使用NtQuerySystemInformation()
并枚举所有句柄,直到找到引用该文件的句柄为止
2) 使用DuplicateHandle()
复制该句柄,使其在您自己的进程中有效
3) 关闭仅创建句柄指定复制\u Close\u SOURCE
,它将同时关闭您的句柄和原始句柄(当然,如果您的进程具有足够的权限)
4) 再次调用NtQuerySystemInformation()
检查文件是否真的关闭了,如果不是,那么您可能需要直接关闭其父进程。您不能通过任何直接的方法关闭由其他进程打开的文件。因此,我应该终止进程以关闭文件,对吗?这是您的应用程序吗?如果是,则您可以发送消息以释放它或使用进程间锁。使用它的其他进程是什么?这是你的应用程序本身吗?你可以找到很多关于锁定、多线程的文章,这是msdn关于锁定的内容,我的文件正被另一个进程使用,所以我需要关闭该进程(线程)才能删除该文件。我的文件正被另一个进程使用,所以我需要关闭该进程(线程)为了删除文件。@JoseRamon您可以这样做(关闭该进程),但要小心。这是关闭线程的方法吗?