abrir arquivo no modo exclusivo em c #

Eu quero abrir um arquivo para leitura no modo exclusivo, e se o arquivo já está aberto por algum processo / thread, eu quero receber uma exceção. Eu tentei o seguinte código, mas não está funcionando, mesmo se eu abri o foo.txt, eu ainda posso chegar à instrução Console.WriteLine. Alguma ideia?

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

O que você está fazendo é a coisa certa. Provavelmente você está apenas testando incorretamente. Você deve abri-lo com um programa que bloqueia o arquivo quando ele está aberto . O bloco de notas não faria. Você pode executar seu aplicativo duas vezes para ver:

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

O que você fez está correto.

Se você precisa do que são todos os arquivos já abertos, então existe uma maneira de ver por NtQuerySystemInformation

Você pode ter uma idéia de http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx

que obtém todos os arquivos abertos em um diretório .. que pode ser estendido para um único arquivo se aberto ou não …

O FileShare.None só funcionará se outro processo também tiver aberto o arquivo sem permitir que ele seja compartilhado para leituras.

Programas como o bloco de notas e o Visual Studio não bloqueiam arquivos de texto.

Teste-o escrevendo um programa simples no modo console que abra o arquivo e espere:

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

Executar esse programa a partir da linha de comando (ou outra instância do Visual Studio) e, em seguida, execute o programa. Dessa forma, você pode jogar com valores diferentes para FileMode e FileShare para garantir que seu programa reaja corretamente em todos os casos.

E não, você não precisa verificar se o arquivo está aberto primeiro. Seu código deve lançar uma exceção se o arquivo já estiver aberto. Então tudo que você precisa fazer é lidar com essa exceção.

Gostaria de sugerir usando o membro FileAccess.ReadWrite porque alguns arquivos já podem estar abertos, mas permitem access de Read no arquivo. No entanto, eu diria que em condições não excepcionais, todos os arquivos abertos para access de Read/Write não permitirão que seu código Write no arquivo.

É claro (como o Mehrdad já explicou), se você estiver usando um editor como o Bloco de Notas para abrir o arquivo como um teste, não será possível restringir o access porque o Bloco de Notas não bloqueia o arquivo.