如何检查文件当前是打开还是在.NET中写入?

我正在尝试确定文件当前是打开还是使用C#写入。 我已经看到类似的SO问题,所有问题都与我的代码类似,它在文件上尝试File.Open。 但是当我使用下面的代码运行程序时,我也手动打开文件,我得到“文件当前未锁定”的意外结果。 任何想法/建议/我遗失的任何东西?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading; namespace TestIfFileAccessed { class Program { static void Main(string[] args) { string path = @"C:\TEMP\testFile.txt"; FileInfo filepath = new FileInfo(path); if (IsFileLocked(filepath)) { Console.WriteLine("File is currently locked"); Console.ReadLine(); } else { Console.WriteLine("File is currently NOT locked"); Console.ReadLine(); } } public static bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { //the file is unavailable because it is: //still being written to //or being processed by another thread //or does not exist (has already been processed) return true; } finally { if (stream != null) stream.Close(); } //file is not locked return false; } } } 

文本文件通常不会被锁定 – 它们的信息通常被拉入并加载到内存中,所以除非你试图在另一个程序正在加载文件的同一时刻访问它(这会非常快),那么你不应该有任何问题。

来源 – 类似的问题

编辑:如果它是单词打开然后你会有问题,因为Word保持流打开。 尝试在Word中打开文件(如果有的话)并再次运行代码,我相信它应该可行。 否则,如果要查看它是否在记事本中打开,则必须扫描系统上运行的当前进程以获取记事本,并检查进程是否打开了该文件。

许多文本编辑器实际上并没有对文件进行文件锁定。 例如,我使用Sublime Text 3编辑文件。 我可以在Sublime中打开一个.txt文件,然后在另一个编辑器中打开SAME文件,例如记事本。 .txt文件中没有文件锁。

发生的事情是,当您打开文件然后立即关闭时,编辑器会将文件加载到内存中。 他们没有被打开。 编辑器只保持文件打开足够长的时间来加载它们,但是,在编辑器将文件加载到RAM中时,技术上会锁定文件。 它只是不会持续很长时间,因为这个操作非常快。

如果你做filepath.Open();你可能导致文件锁定,并按预期看到你的文件锁错误 在调用IsFileLocked(filepath) 。 如果你想测试一下,我建议你在Main方法中尝试这个代码:

 static void Main(string[] args) { string path = @"C:\TEMP\testFile.txt"; FileInfo filepath = new FileInfo(path); Console.WriteLine("Opening \"filepath\""); filepath.Open(); FileInfo filepath2 = new FileInfo(path); if (IsFileLocked(filepath2)) { Console.WriteLine("File is currently locked"); } else { Console.WriteLine("File is currently NOT locked"); } Console.WriteLine("Closing \"filepath\""); filepath.Close(); if (IsFileLocked(filepath2)) { Console.WriteLine("File is currently locked"); } else { Console.WriteLine("File is currently NOT locked"); } } 

我希望这有助于澄清正在发生的事情。

如果这个答案结果不正确并且羞辱了我的家人,我发誓要落在我的剑上。