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

时间:2015-08-06 19:21:05

标签: c# .net io

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

Team Explorer

2 个答案:

答案 0 :(得分:9)

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

来源 - Similar question

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

答案 1 :(得分:3)

许多文本编辑实际上并没有对文件进行文件锁定。例如,我使用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"); } } 方法中尝试使用此代码:

ControlCommand(.., .., .., "Uncheck", ..)

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

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