c# - 检查文件是否正在使用 - 附加问题

标签 c# file locking

我正在尝试寻找使用重新启动管理器来检查文件是否被锁定的替代方法。我找到了 this accepted answer同样的问题。但是,已接受的答案包含以下我不明白的评论:“如果文件没有写入或读取锁定,则此解决方案将不起作用,即已使用 FileShare 打开(读取或写入)。读取或 FileShare.Write 访问。”
我使用以下代码对此进行了测试(为简洁起见,使用块和 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();
}
这总是显示“文件是否被锁定?真”,而根据注释,它应该显示“假”。
我还测试了 this answer 的代码它有类似的评论,但没有运气。还使用两个单独的过程进行了测试 - 正如预期的那样没有区别。
看着 the docs ,我的测试结果似乎合理 - 但我对上述评论感到困惑。
我还能如何打开文件,例如在不创建锁的情况下阅读?

最佳答案

您引用的答案部分不正确。阻止您打开已打开文件的机制是共享模式,而不是所需的访问类型。
当您尝试打开已在使用的文件时,将请求的共享模式与打开文件时使用的共享模式进行比较。如果它们不匹配,您的调用将失败。
编辑:只是为了涵盖我的所有基础,以上仅适用于 Windows。在基于 POSIX 的系统上,可以在没有任何互斥的情况下打开文件。但是,在引用答案时,.NET 是 Windows 独有的。

关于c# - 检查文件是否正在使用 - 附加问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67893464/

相关文章:

asp.net - 根据需要在服务器中生成并提供文件。在不消耗太多资源的情况下最好的方法是什么?

java - 如何同步操作?

Qt:如何锁定/防止文件在写入时被读取?

c# - 如何检索资源中嵌入的文件的路径(资源管理器)

c# - 在 C# 中对十进制数据类型执行数学运算?

c# - 将预先存在的跟踪类与 CurveList 一起使用

java - 在java中通过命令行输入一个文本文件

c++ - 在c++中搜索和替换txt文件中的字符串

c# - SmartFormat.NET 列表格式中嵌套占位符错误

database - 锁表直到事务提交