abrir archivo en modo exclusivo en C #

Quiero abrir un archivo para leer en modo exclusivo, y si el archivo ya está abierto por algún proceso / subproceso, quiero recibir una excepción. Probé el siguiente código, pero no funcionaba, incluso si abrí foo.txt, aún puedo llegar a la statement Console.WriteLine. ¿Algunas ideas?

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

Lo que estás haciendo es lo correcto. Probablemente solo lo estás probando incorrectamente. Debería abrirlo con un progtwig que bloquea el archivo cuando está abierto . El bloc de notas no funcionaría. Puede ejecutar su aplicación dos veces 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(); } 

Lo que has hecho es correcto.

Si necesita todos los archivos que ya están abiertos, entonces hay una manera de verlos por NtQuerySystemInformation

Puede obtener una idea de http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx

que obtiene todos los archivos abiertos en un directorio … que se puede extender a un solo archivo, ya sea que se abra o no …

FileShare.None solo funcionará si otro proceso también ha abierto el archivo sin permitir que se comparta para lecturas.

Los progtwigs como el Bloc de notas y Visual Studio no bloquean los archivos de texto.

Pruébelo escribiendo un sencillo progtwig en modo consola que abra el archivo y luego 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(); } } 

Ejecute ese progtwig desde la línea de comandos (u otra instancia de Visual Studio) y luego ejecute su progtwig. De esta forma, puede jugar con diferentes valores para FileMode y FileShare para asegurarse de que su progtwig reaccione correctamente en todos los casos.

Y, no, no tiene que verificar para ver si el archivo está abierto primero. Su código debería arrojar una excepción si el archivo ya está abierto. Entonces, todo lo que tiene que hacer es manejar esa excepción.

Sugeriría usar el miembro FileAccess.ReadWrite porque algunos archivos pueden estar ya abiertos, pero le permiten acceso de Read en el archivo. Sin embargo, supongo que en condiciones no excepcionales, todos los archivos abiertos para acceso de Read/Write no permitirán que su código Write en el archivo.

Por supuesto (como Mehrdad ya explicó), si está utilizando un editor como el Bloc de notas para abrir el archivo como una prueba, no podrá restringir el acceso porque el Bloc de notas no bloquea el archivo en absoluto.