检查文件是否正在使用-其他问题



我正在尝试找到一种替代方法,以使用Restart Manager来检查文件是否被锁定。对于同一个问题,我找到了这个公认的答案。然而,被接受的答案包含以下我不理解的评论:;如果文件上没有写或读锁定,即文件已使用FileShare打开(用于读取或写入(,则此解决方案将不起作用。Read或FileShare。写入访问">

我使用以下代码对此进行了测试(为了简洁起见,使用块和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();
}

这总是显示";文件是否已锁定?真"而它应该显示";"错误";根据评论。

我还测试了这个答案的代码,它有类似的评论,但运气不好。还通过两个单独的过程进行了测试-正如预期的那样没有差异。

查看文档,我的测试结果似乎很合理,但我对上面提到的评论感到困惑。

否则我该如何打开文件,例如在不创建锁的情况下进行读取?

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

当您尝试打开已在使用的文件时,会将请求的共享模式与打开该文件时使用的共享模式进行比较。如果它们不匹配,则您的呼叫失败。

编辑:为了涵盖我的所有基础,以上内容仅适用于Windows。在基于POSIX的系统上,可以在没有任何互斥的情况下打开文件。然而NET在引用答案时是Windows独有的。

最新更新