在C#中以独占模式打开文件

我想在独占模式下打开一个文件进行读取,如果某个进程/线程已经打开了该文件,我想收到一个exception。 我尝试了以下代码,但没有工作,即使我打开了foo.txt,我仍然可以访问Console.WriteLine语句。 有任何想法吗?

static void Main(string[] args) { using (Stream iStream = File.Open("c:\\software\\code.txt", FileMode.Open, FileAccess.Read, FileShare.None)) { Console.WriteLine ("I am here"); } return; } 

你正在做的是正确的事情。 可能你只是错误地测试它。 您应该使用一个程序打开它,该程序在文件打开时将其锁定 。 记事本不会这样做。 您可以运行两次应用程序以查看:

 static void Main(string[] args) { // Make sure test.txt exists before running. Run this app twice to see. File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.None); Console.ReadKey(); } 

你所做的是正确的。

如果您需要已经打开的所有文件,那么有一种方法可以通过NtQuerySystemInformation查看

您可以从http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx获得建议

获取在目录中打开的所有文件..无论是否打开,都可以扩展到单个文件…

FileShare.None仅在另一个进程也打开文件而不允许为读取共享时才起作用。

记事本和Visual Studio等程序不会锁定文本文件。

通过编写一个打开文件然后等待的简单控制台模式程序来测试它:

 static void Main(string args[]) { using (FileStream f = File.Open("c:\\software\\code.txt", FileMode.Open, FileAccess.Read, FileShare.None)) { Console.Write("File is open. Press Enter when done."); Console.ReadLine(); } } 

从命令行(或Visual Studio的另一个实例)运行该程序,然后运行您的程序。 这样,您可以使用FileMode和FileShare的不同值来确保您的程序在所有情况下都能正确响应。

而且,不,您不必检查文件是否先打开。 如果文件已经打开,您的代码应该抛出exception。 因此,您所要做的就是处理该exception。

我建议使用FileAccess.ReadWrite成员,因为某些文件可能已经打开但允许您对该文件进行Read访问。 但是,我猜想在非特殊情况下,所有打开Read/Write访问权限的文件都不允许您的代码Write文件。

当然(正如Mehrdad已经解释的那样),如果您使用记事本之类的编辑器将文件作为测试打开,您将无法限制访问,因为记事本根本不会锁定文件。