Открыть файл в эксклюзивном режиме в С#

Я хочу открыть файл для чтения в эксклюзивном режиме, и если файл уже открыт каким-то процессом/нитью else, я хочу получить исключение. Я пробовал следующий код, но не работал, даже если я открыл 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;
}

Ответ 1

То, что вы делаете, правильно. Возможно, вы просто проверяете его неправильно. Вы должны открыть его с помощью программы, которая блокирует файл при его открытии. Блокнот не будет делать. Вы можете запустить свое приложение дважды, чтобы увидеть:

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

Ответ 2

То, что вы сделали, является правильным.

Если вам нужны все открытые файлы, то есть способ увидеть NtQuerySystemInformation

Вы можете получить представление от http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx

который получает все файлы, открытые в каталоге.. который может быть расширен до одного файла независимо от того, открыт он или нет...

Ответ 3

Я бы предложил использовать элемент FileAccess.ReadWrite, потому что некоторые файлы могут быть открыты, но позволяют вам Read доступ к файлу. Однако я предполагаю, что в не исключительных условиях все файлы, открытые для доступа Read/Write, не позволят вашему коду Write к файлу.

Конечно, как уже объяснил Мехрдад, если вы используете редактор, такой как Notepad, чтобы открыть файл в качестве теста, вы не сможете ограничить доступ, потому что Notepad не блокирует файл вообще.

Ответ 4

FileShare.None будет работать только в том случае, если другой процесс также открыл файл, не позволяя ему делиться для чтения.

Программы, такие как Notepad и Visual Studio, не блокируют текстовые файлы.

Ответ 5

Проверьте это, написав простую консольную программу, которая открывает файл, а затем ждет:

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, чтобы убедиться, что ваша программа реагирует правильно во всех случаях.

И нет, вам не нужно проверять, открыт ли файл первым. Ваш код должен генерировать исключение, если файл уже открыт. Итак, все, что вам нужно сделать, это обработать это исключение.