文件.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)抛出错误:

进程无法访问该文件,因为另一个进程正在使用该文件过程

为什么?因为我想检查一个文件是否可以在写模式下打开。

文件.OpenWrite给出错误,而FileStream(sFile、FileMode.Open、FileAccess.

用于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方法最终是多余的。当您尝试以独占方式访问文件时,您可以捕获异常。