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(字符串路径)
,如果可用,该函数将获得独占写入锁。