2009-07-16 15 views
5

Estoy escribiendo una aplicación C# para leer un archivo que otra aplicación mantiene abierta. Como algunos de ustedes pueden adivinar, todo lo que obtengo es IOExceptions porque "el archivo está siendo utilizado por otro proceso". Intenté ajustar File.Open() un poco; este es mi intento actual:¿Qué indicadores abren un archivo como lo hace Notepad.exe?

FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); 

(. Yo sé que la bandera FileShare es más significativa para otros procesos que se acceso al archivo a partir de entonces, pero he tratado con él de todos modos)

¿Qué rompecabezas es que Notepad.exe abrirá el archivo muy bien. Antes de profundizar en Filemon para obtener más pistas, ¿alguno de ustedes sabe cómo abrir el archivo como lo hace el Bloc de notas? Gracias.

Respuesta

5

Casi lo tienes. Usted realmente quiere FileShare.ReadWrite:

FileStream fsIn = File.Open(fileName, 
          FileMode.Open, 
          FileAccess.Read, 
          FileShare.ReadWrite); 

FileShare.Read no permite que otros procesos escriban a ese archivo. FileShare.ReadWrite lo permite.

Escribir permite la apertura subsiguiente de el archivo para escritura. Si este indicador es no especificado, cualquier solicitud para abrir el archivo para escribir (mediante este proceso o otro proceso) fallará hasta que se cierre el archivo . Sin embargo, incluso si se especifica este indicador , aún se necesitan permisos adicionales para acceder al archivo.

ReadWrite Permite posterior apertura del archivo para lectura o escritura. Si este indicador es no especificado, cualquier solicitud para abrir el archivo para lectura o escritura (mediante este proceso u otro proceso) no se realizará hasta el archivo . Sin embargo, , incluso si se especifica este indicador, permisos adicionales aún pueden ser necesarios para acceder al archivo.

También estoy de regreso conmigo.

-2

Probar:

FileStream file = new FileStream(filename, FileMode.Open); 
+0

Desafortunadamente, ¡no se comporta mejor! Gracias de cualquier manera. – Humberto

3

Bueno, si se trata de pequeños archivos, sólo tiene que utilizar

string myFileContents = System.IO.File.ReadAllText(@"c:\daniellesteele.txt"); 

para texto o

byte[] myfileContents = System.IO.File.ReadAllBytes(@"c:\aleagueoftheirmoan.mpg"); 

para archivos binarios.

+0

tentado a dar +1 para el mpg: P –

+0

... pero solo tentado. –

+0

nombre de archivo interesante ....: P – nstehr

1

¿Estás seguro de que el Bloc de notas puede abrir el archivo después de el otro proceso lo ha abierto? Parece que depende de quién es el propietario inicial del archivo si se otorga el uso compartido. Véase el siguiente ejemplo de MSDN:

The following FileStream constructor opens an existing file and grants read-only access to other users (FileShare.Read). 

[C#] 
FileStream s2 = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read); 

Por supuesto que no soy un experto sistema operativo, por lo que este puede ser completamente equivocada.

0

Con esta

FileStream fsIn = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

que permitir que otros programas modifican el archivo, mientras que su abierta en su programa. Por lo tanto, si abre el archivo, no se ejecutará la excepción IOException "el archivo está siendo utilizado por otro proceso".

Cuestiones relacionadas