c#检查文件是否打开
本文关键字:是否 文件 检查 | 更新日期: 2023-09-27 18:07:08
我需要验证特定文件是否打开,以防止该文件的复制。
我尝试了很多例子,但任何一个都不起作用!例如,我尝试这样做:
protected virtual bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
我需要方向…我在哪里失败了?建议吗?
如果您想知道您的应用程序是否已经打开了该文件,您应该将FileStream
保存在一个字段中,并在关闭流时将该字段重置为null
。然后,您可以简单地测试并获得文件的FileStream
。
如果您想知道另一个应用程序是否已经打开了该文件,那么您可以做的不多。当您尝试打开该文件时,可能会遇到异常。但是,即使您知道,那么您也无法阻止该文件的复制,因为您在应用程序中没有对该文件或其FileStream
的引用。
您可能会遇到线程竞争条件,有文档示例将其用作安全漏洞。如果您检查了该文件是否可用,但随后尝试使用它,那么您可能会在这一点上抛出错误,恶意用户可能会使用它来强制和利用您的代码。
你最好使用try catch/finally来获取文件句柄。
try
{
using (Stream stream = new FileStream("MyFilename.txt", FileMode.Open))
{
// File/Stream manipulating code here
}
} catch {
//check here why it failed and ask user to retry if the file is in use.
}
或
查看另一个选项
https://stackoverflow.com/a/11060322/2218635