2009-06-26 26 views
20

Tengo una aplicación de winforms que se carga en archivos de Excel para su análisis. Actualmente, para abrir el archivo de Excel, el archivo no debe estar ya abierto en Excel; de lo contrario, se genera una excepción FileIOException cuando intento cargar el archivo.Cómo abro un archivo que se abre en otra aplicación

Lo que me gustaría hacer es permitir que mi aplicación lea en el archivo, incluso si está abierto en Excel en lugar de forzar al usuario a cerrar primero la hoja de trabajo. Tenga en cuenta que la aplicación en cuestión solo necesita leer el archivo, no escribir en él.

¿Esto es posible?

Respuesta

26

Usted podría intentar pasar FileShare.ReadWrite al abrir el archivo:

using (var stream = new FileStream(
     @"d:\myfile.xls", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) 
{ 

} 
+0

Creo que el indicador FileShare es para el otro caso - cuando desea permitir que otras aplicaciones tengan acceso al archivo – ChrisF

+0

Esto desde los metadatos: "Contiene constantes para controlar el tipo de acceso otros objetos System.IO.FileStream pueden tener el mismo archivo " – ChrisF

+4

En el caso de los abridores futuros, un FileShare.Read significa que los abridores futuros pueden abrir el archivo para su lectura". En el caso de abridores anteriores, FileShare.Read significa "abrir este archivo solo si tiene abridores anteriores que lo abrieron solo para lectura". Es por eso que FileShare.ReadWrite necesita ser utilizado aquí, porque Excel abre el archivo para escritura. –

6

¿Cómo está intentando abrir el archivo?

Si está intentando abrirlo para leer/escribir, obtendrá la excepción. Si intenta abrirlo solo para leer, entonces debería estar bien.

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

Esto sólo funcionará si Excel ha abierto el archivo con FileShare.Read conjunto para permitir que otras aplicaciones (es decir, sus'S) para tener acceso al archivo. Si esto no está configurado, Excel habrá abierto el archivo con acceso exclusivo. Nota: No creo que este sea el caso, ya que puede abrir un archivo de Excel (en Excel) para leer si alguien más tiene abierto para editar.

ACTUALIZACIÓN - OK No probé esto correctamente hasta después de los comentarios de Darin. Necesita la marca FileShare.ReadWrite a pesar de la ayuda que indica que es para abridores de archivos posteriores. Ni siquiera FileShare.Read es lo suficientemente bueno, lo que me parece aún más extraño.

+0

Esto no es correcto. Usar FileShare.Read significa: "abrir este archivo solo si los abridores anteriores lo abrieron para lectura". que no es el caso porque Excel lo abrió para escribir. –

+2

@darin - No estoy usando FileShare. – ChrisF

+0

Buena respuesta. De hecho, los archivos de Excel no se abren con acceso exclusivo, por lo que este método es bastante posible. – Noldorin

0

Trate de hacer una copia del archivo ya abierto, leerlo y lo descarta. Para verificar si el archivo ya está abierto, intente leer y manejar la excepción copiando, leyendo, descartando.

1

puede leer libros mientras Excel los tiene abiertos. Aquí está el código que utilizamos para hacerlo (nota que cerramos el archivo completo después de la apertura para mantener Excel o cualquier otra aplicación de la escritura mientras estamos en el medio de la lectura):

stream = new System.IO.FileStream(path, 
    System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, 
    System.IO.FileShare.ReadWrite, 
    SG.CompoundDocumentIO.Storage.OpenBufferLength); 
try 
{ 
    stream.Lock(0, stream.Length); 
} 
catch 
{ 
    // .NET 1.1 requires cast to IDisposable 
    ((IDisposable)stream).Dispose(); 
    throw; 
} 

responsabilidad: Soy dueño de SpreadsheetGear LLC

Cuestiones relacionadas