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