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

C# 在C中以独占模式打开文件#,c#,file,io,C#,File,Io,我想以独占模式打开一个文件进行读取,如果该文件已经被其他进程/线程打开,我想接收一个异常。我尝试了以下代码,但不起作用,即使我打开了foo.txt,我仍然可以访问Console.WriteLine语句。有什么想法吗 static void Main(string[] args) { using (Stream iStream = File.Open("c:\\software\\code.txt", FileMode.Open, FileAccess.Read, FileShar

我想以独占模式打开一个文件进行读取,如果该文件已经被其他进程/线程打开,我想接收一个异常。我尝试了以下代码,但不起作用,即使我打开了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;
}

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


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

您所做的是正确的。可能您只是测试不正确。您应该使用一个程序打开它,该程序在文件打开时锁定文件。记事本不行。您可以运行应用程序两次以查看:

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();
}

只有当另一个进程也打开了该文件而不允许共享该文件进行读取时,才能使用FileShare.None


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

您所做的是正确的

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

你可以从你的朋友那里得到这个主意


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

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

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使用不同的值,以确保您的程序在所有情况下都能正确响应



而且,不需要先检查文件是否打开。如果文件已打开,则代码应引发异常。所以你所要做的就是处理这个异常。

“即使我打开了foo.txt”->你是如何打开它的?是的,Mehrdad。我打开它,然后执行我的程序,仍然可以读取Console.WriteLine语句。有什么想法吗?用记事本?记事本在运行时不会锁定文件。它读取内存中的文件,并在保存时重新打开以进行写入。我想为了达到我的目的(在其他进程/线程打开此文件时不要对此文件进行操作),我需要检查文件是否已打开,对吗?谢谢Jakob,无论如何,要检查文件是否已被其他线程/进程打开?嗨,Jakob,我的情况是,一个线程正在对文件进行序列化(使用XML序列化),另一个读取器线程将从此文件中读取。在XML序列化过程中,我不希望读取器线程对该文件进行操作,有什么想法吗?您是如何序列化的?序列化时,必须以独占方式打开文件(即FileAccess.Write和FileShare.None)。对不起,我错了。在我的情况下,我所说的并不是100%准确。(继续)我的情况是,一个线程正在复制文件(使用file.Move方法),另一个线程从文件中读取。我不希望阅读器线程在复制过程中读取文件的一部分(这就是为什么我想要独占打开模式),我发布的代码解决了这个问题吗?谢谢Mehrdad,要检查文件是否已被其他线程/进程打开,我认为没有办法确定进程是否已打开文件并正在处理该文件。从技术上讲,记事本将文件加载到内存后,该文件将不再打开。我认为这是正确的方法,因为记事本或其他程序无法再次打开它(阅读或保存),我认为这很好。谢谢Mehrdad,我已经测试过你的正确性。我的情况是,一个线程正在对文件进行序列化(使用XML序列化),另一个读线程则从该文件中读取。我不想让阅读器线程在XML序列化过程中对这个文件进行操作,有什么想法吗?这已经实现了。如果线程正在读取文件,您将获得IOException;如果读线程在您写入文件时尝试打开文件,您将获得IOException。您好,Mehrdad,我正在使用XML序列化,我不确定是否需要一些特殊设置,以便序列化线程锁定文件,因此,在使用FileShare时,另一个读卡器线程被阻止。无?谢谢您,您是正确的,我正在使用记事本打开它并运行我的程序进行测试。有没有办法检查文件是否打开(例如,我希望我的代码能够检查记事本是否打开了它)?没有,我认为没有。。。除了通过捕获代码中的IOException来尝试随后读取文件之外。我的情况是,一个线程正在对文件进行序列化(使用XML序列化),从该文件读取另一个读线程。我不希望在XML序列化过程中读取器线程对该文件进行操作,有什么想法吗?感谢lakshmanaraj,我的情况是,一个线程对该文件进行序列化(使用XML序列化),另一个读取器线程从该文件中读取。我不希望在XML序列化过程中读取器线程对该文件进行操作,有什么想法吗?您可以通过将信号量设置为operationfile name来锁定该文件或执行互斥操作。file name是任意的,因此很难锁定。更多详细信息,我使用writer线程将任意文件从远程计算机复制到本地计算机,读线程将扫描文件夹并读取新文件的信息(续)我的情况是,一个线程正在复制文件(使用file.Move方法),另一个线程从文件中读取。我不希望读卡器线程在复制过程中读取文件的一部分(这就是为什么我希望使用独占打开模式),我发布的代码是否解决了此问题?是的,在复制操作期间写入文件时会自动锁定,因此您的代码不会丢失