C# FileStream(sFile,FileMode.Open,FileAccess.ReadWrite)未运行时,File.OpenWrite出现错误
我有以下代码来检测文件是否已在使用中:C# FileStream(sFile,FileMode.Open,FileAccess.ReadWrite)未运行时,File.OpenWrite出现错误,c#,file-io,filestream,.net,C#,File Io,Filestream,.net,我有以下代码来检测文件是否已在使用中: public static bool FileInUse(string sFile) { FileStream file = null; try { file = new FileStream(sFile, FileMode.Open, FileAccess.ReadWrite); file.Close(); file = File.OpenWrite(sFile);
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;
}
}
当文件正在使用时,newfilestream(sFile,FileMode.Open,FileAccess.ReadWrite)
不会抛出错误,但file.OpenWrite(sFile)
抛出错误:
进程无法访问该文件,因为另一个进程正在使用该文件
过程
为什么呢?因为我想检查文件是否可以在写入模式下打开。您用于
FileStream
的构造函数默认为共享模式FileShare.Read
,这意味着以后可以请求打开文件进行读取(而不是写入)。即使文件已经打开进行读取(如果不是独占读取),这也会起作用
在File.OpenWrite
上,MSDN online声明:
此方法相当于FileStream(String、FileMode、FileAccess、FileShare)构造函数重载,其中file mode设置为OpenOrCreate,access设置为Write,共享模式设置为None
这意味着File.OpenWrite
尝试获得对文件的独占读取访问权,而不仅仅是独占写入访问权
听起来好像当你测试你的文件“正在使用”时,它是打开的
这两种方法都检查文件是否可用于独占写入。您需要决定您的应用程序是否也需要独占阅读 因为
File.OpenWrite(sFile) -> return new FileStream(path, FileMode.OpenOrCreate,
FileAccess.Write, FileShare.None);
但是
公共文件流(字符串路径、文件模式、文件访问)
:这(路径、模式、访问、FileShare.Read、DefaultBufferSize、FileOptions.None、path.GetFileName(path)、false){
}
如您所见,第一个使用FileShare.None,但第二个使用FileShare.Read
从MSDN:
FileShare.None拒绝共享当前文件。任何打开文件的请求(通过此进程或其他进程)都将失败,直到文件关闭
读取允许随后打开文件进行读取。如果未指定此标志,任何打开文件进行读取的请求(通过此进程或其他进程)都将失败,直到文件关闭。但是,即使指定了此标志,也可能需要其他权限才能访问该文件
有点离题,但是:没有很好的方法来检查文件是否正在使用,因为在调用FileInUse方法和调用打开文件之间的一段时间内,该文件可能会再次被锁定。这种FileInUse方法最终是多余的。当您尝试以独占方式访问文件时,您可以捕获异常。除了下面的答案之外,这也是文件类型和打开程序的一个因素。一些应用程序也会限制共享阅读,并且会在这两个示例中导致异常。您好,谢谢。在打开文件进行写入之前,我想检查独占写入但共享可读取的内容。我怎么做?嗨,谢谢。在打开文件进行写入之前,我想检查独占写入但共享可读取的内容。我怎么做?使用
新文件流(sFile,FileMode.Open,FileAccess.ReadWrite)
@ComputerUser,正如@m0s所指出的,FileInUse
是多余的,如果你想打开文件。可能会将其更改为FileStream TryOpen(字符串路径)
,如果可用,该函数将获得独占写入锁。