检查文件是否正在使用 - 附加问题
Check if file is in use - additional question
我正在尝试寻找一种替代方法来使用重新启动管理器来检查文件是否被锁定。我发现 this accepted answer 同样的问题。但是,接受的答案包含以下我不理解的评论:“如果文件没有写或读锁,则此解决方案将不起作用,即它已使用 [= 打开(用于读取或写入) 26=] 或 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();
}
这总是显示“文件是否锁定?True”,而根据评论它应该显示“False”。
我也测试了 this answer 的代码,它有类似的注释,但没有成功。还测试了两个单独的进程 - 正如预期的那样没有区别。
查看 the docs,我的测试结果似乎还算合理 - 但我对上述评论感到困惑。
我还能如何打开文件,例如在不创建锁的情况下阅读?
您引用的部分答案不正确。阻止您打开已打开文件的机制是共享模式,而不是所需的访问类型。
当您尝试打开一个已在使用的文件时,请求的共享模式将与打开文件时使用的共享模式进行比较。如果它们不匹配,您的呼叫将失败。
编辑: 为了涵盖我的所有基础,以上只适用于 Windows。在基于 POSIX 的系统上,可以在没有任何互斥的情况下打开文件。但是,在引用答案时,.NET 是 Windows 独有的。
我正在尝试寻找一种替代方法来使用重新启动管理器来检查文件是否被锁定。我发现 this accepted answer 同样的问题。但是,接受的答案包含以下我不理解的评论:“如果文件没有写或读锁,则此解决方案将不起作用,即它已使用 [= 打开(用于读取或写入) 26=] 或 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();
}
这总是显示“文件是否锁定?True”,而根据评论它应该显示“False”。
我也测试了 this answer 的代码,它有类似的注释,但没有成功。还测试了两个单独的进程 - 正如预期的那样没有区别。
查看 the docs,我的测试结果似乎还算合理 - 但我对上述评论感到困惑。
我还能如何打开文件,例如在不创建锁的情况下阅读?
您引用的部分答案不正确。阻止您打开已打开文件的机制是共享模式,而不是所需的访问类型。
当您尝试打开一个已在使用的文件时,请求的共享模式将与打开文件时使用的共享模式进行比较。如果它们不匹配,您的呼叫将失败。
编辑: 为了涵盖我的所有基础,以上只适用于 Windows。在基于 POSIX 的系统上,可以在没有任何互斥的情况下打开文件。但是,在引用答案时,.NET 是 Windows 独有的。