文件.OpenWrite给出错误,而FileStream(sFile、FileMode.Open、FileAccess.
本文关键字:sFile FileMode FileAccess Open FileStream OpenWrite 出错 错误 文件 | 更新日期: 2023-09-27 18:00:58
我有以下代码来检测文件是否已经在使用:
public static bool FileInUse(string sFile)
{
FileStream file = null;
try
{
file = new FileStream(sFile, FileMode.Open, FileAccess.ReadWrite);
file.Close();
file = File.OpenWrite(sFile);
file.Close();
return false;
}
catch (Exception)
{
try { file.Close(); }
catch (Exception) { }
return true;
}
}
当文件正在使用时,new FileStream(sFile, FileMode.Open, FileAccess.ReadWrite)
不会抛出错误,但File.OpenWrite(sFile)
抛出错误:
进程无法访问该文件,因为另一个进程正在使用该文件过程
为什么?因为我想检查一个文件是否可以在写模式下打开。
用于FileStream
的构造函数默认为共享模式FileShare.Read
,这意味着以后将允许打开文件进行读取(但不允许写入(的请求。即使文件已经打开进行读取(如果不是独占读取(,这也会起作用。
在File.OpenWrite
上,MSDN联机状态:
此方法等效于FileStream(String、FileMode、FileAccess、FileShare(构造函数重载,其中文件模式设置为OpenOrCreate,访问设置为Write,共享模式设置为None。
http://msdn.microsoft.com/en-us/library/system.io.file.openwrite(v=vs.110(.aspx
这意味着File.OpenWrite
尝试获得对文件的独占读取访问权限,而不仅仅是独占写入访问权限。
听起来,当你测试你的文件是否"正在使用"时,它是为读取而打开的。
这两种方法都会检查文件是否可用于独占写入。您需要决定您的申请是否也需要独家阅读。
因为
File.OpenWrite(sFile) -> return new FileStream(path, FileMode.OpenOrCreate,
FileAccess.Write, FileShare.None);
但是
public FileStream(字符串路径、FileMode模式、FileAccess访问(:this(路径、模式、访问、FileShare.Read、DefaultBufferSize、FileOptions.None、path.GetFileName(路径(、false({}
正如您所看到的,第一个使用FileShare。无,但第二个使用FileShare。读取
来自MSDN:
文件共享。无拒绝共享当前文件。任何打开文件的请求(通过此进程或其他进程(都将失败,直到文件关闭。
文件共享。读取允许随后打开文件进行读取。如果未指定此标志,则(由该进程或其他进程(打开文件进行读取的任何请求都将失败,直到文件关闭为止。但是,即使指定了此标志,访问该文件可能仍然需要额外的权限。
有点偏离主题,但是:没有很好的方法来检查文件是否正在使用,因为在调用FileInUse方法和调用打开文件之间的一段时间内,这个文件可能会再次被锁定。这个FileInUse方法最终是多余的。当您尝试以独占方式访问文件时,您可以捕获异常。