检查文件是否正在使用 - 额外问题

4
我正在寻找替代 Restart Manager 的方法来检查文件是否被锁定。我在这个相同问题的 这个回答 中找到了一些线索。然而,该回答包含以下评论,我无法理解:“如果文件没有写入或读取锁定,则此解决方案无效,即已经使用 FileShare.Read 或 FileShare.Write 访问模式(用于读取或写入)打开它。”
我使用以下代码进行测试(为简洁起见省略了 using 块和 Close()):
static void Main(string[] args)
{
    const string fileName = "test.txt";

    // This should open the file as described, shouldn't it?
    var fi1 = new FileInfo(fileName);
    // Test with FileShare.Read / FileShare.Write / FileShare.ReadWrite gives the same result
    var fs1 = fi1.Open(FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);

    var fi2 = new FileInfo(fileName);
    Console.WriteLine($"Is file locked? {IsFileLocked(fi2)}");
    // Displays always: "Is file locked? True" 

    Console.ReadLine();
}

这将始终显示“文件是否锁定?True”,而根据评论应该显示“False”。
我还测试了这个答案的代码,它有一个类似的评论,但没有成功。我也尝试了两个独立进程的测试-如预期的那样没有区别。
查看文档后,我的测试结果似乎是合理的,但我对上述提到的评论感到困惑。
否则,我怎样才能打开一个文件(例如进行读取),而不会创建锁定呢?

我已经编辑了被接受的答案,以删除令人困惑的陈述。我怀疑作者从另一个回答中复制了它,指出了FileAccess.ReadWrite和只读文件的问题。 - Collin Dauphinee
1个回答

0

你引用的答案部分是不正确的。防止你打开已经打开的文件的机制是共享模式,而不是所需访问类型。

当你尝试打开一个已经在使用中的文件时,请求的共享模式会与文件打开时使用的共享模式进行比较。如果它们不匹配,你的调用将失败。

编辑:为了覆盖所有情况,上述内容仅适用于Windows。在基于POSIX的系统上可以打开没有任何互斥的文件。然而,在引用的答案发布时,.NET只能在Windows上使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接