Открыть файл в эксклюзивном режиме в С#
Я хочу открыть файл для чтения в эксклюзивном режиме, и если файл уже открыт каким-то процессом/нитью 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, чтобы убедиться, что ваша программа реагирует правильно во всех случаях.
И нет, вам не нужно проверять, открыт ли файл первым. Ваш код должен генерировать исключение, если файл уже открыт. Итак, все, что вам нужно сделать, это обработать это исключение.