2010-10-02 46 views
7

Estoy creando una aplicación en C# en la que tengo que abrir un archivo CSV para leer datos de ella. Obtengo una excepción cuando intento abrir el archivo CSV desde C# cuando ese archivo ya está abierto en Excel. La excepción dice que el proceso no puede acceder al archivo porque ya está abierto. ¿Cómo puedo resolver este problema y abrir el archivo incluso si está abierto en otra aplicación?Excepción al abrir un archivo que ya está abierto

Gracias, Rakesh.

+0

favor publicar algo de código para mostrarnos lo que ha hecho hasta ahora – Woot4Moo

+1

Este es el código: using (FileStream fs = new FileStream (csvOpenFileDialog.FileName, FileMode.Open, FileAccess.Read)) –

+0

Te estás perdiendo una discusión. Lee mi respuesta – Nayan

Respuesta

7

Me enfrenté a este problema hace algún tiempo.

Falta el parámetro FileShare. Sin especificar eso, si abre un archivo, será bloqueado exclusivamente por su aplicación. Pero como ya ha sido abierto por Excel (o cualquier otra aplicación), recibirá una excepción.

Usted puede intentar usar esto - creo que esto va a ser su mejor apuesta -

using (FileStream fs = File.Open(<file-path>, FileMode.Open, FileAccess.Read, FileShare.Read))

Este código dice: Hola Excel! Si puede permitir (leer, no lanzar una excepción), me gustaría leer el archivo, aunque no intentaré ser el propietario y sé que puede modificarlo en cualquier momento.

Si esto arroja un error, entonces Excel le ha denegado incluso el acceso de lectura. ¡Qué lástima! Todo lo mejor.

+2

Encontré FileShare.Read no funcionó, mientras que FileShare.ReadWrite lo hizo –

+1

No estoy seguro de lo que hizo, pero ... es bueno, lo que sea que funcione para usted! – Nayan

+0

Use FileShare.ReadWrite en lugar de FileShare.Read, como lo menciona Hans. –

0

Debido a problemas de simultaneidad, no puede tener la opción de escribir en dos instancias del mismo archivo. Debería ser posible abrir uno como de solo lectura, esto permitiría que no haya problemas de simultaneidad, ya que la lectura garantiza la seguridad de los subprocesos. This article debe explicar cómo hacer lo que propuse

+0

Estoy abriendo el archivo desde C# en modo de solo lectura. Pero aún estoy recibiendo esta excepción. ¿Cuál podría ser el problema y cómo puedo resolverlo? –

0

Eso no es posible.

Se puede abrir un archivo con otro tipo de protección. Excel abre el archivo exclusivamente, con el fin de proteger el archivo para que no sea modificado por otro programa y luego se revierte cuando Excel lo guarda.

Excel podría haber abierto el archivo y permitido la lectura, pero luego podría terminar en una situación de punto muerto donde dos aplicaciones tienen el archivo abierto para leer, y ninguno puede guardar nada atrás.

+0

Ese no parece ser el caso basado en el enlace que proporcioné. – Woot4Moo

+0

@ Woot4Moo: Ese artículo trata sobre abrir una hoja de cálculo, no un archivo CSV, y sobre abrir un archivo para acceso de solo lectura, sin abrir un archivo que ya está abierto exclusivamente, así que lo siento pero no es relevante en absoluto. – Guffa

+0

en realidad es bastante relevante. Si OP echa un vistazo al orden en que se abren los archivos, puede hacer que Excel abra el archivo primero como una instancia de solo lectura que podría mitigar el problema – Woot4Moo

7

Es posible, pero debe controlar cuidadosamente el intercambio de archivos que especifique. La mayoría de las clases de .NET predeterminan FileShare.Read, denegando que otro proceso escriba en el archivo. Pero eso no puede funcionar si Excel abre el archivo, ya obtuvo acceso de escritura a él. No puede negar un derecho que ya fue adquirido.

Para solucionar el problema, hacer que su código de aspecto similar a este:

 using (var fs = new FileStream(@"c:\\temp\\test.csv", FileMode.Open, 
        FileAccess.Read, FileShare.ReadWrite)) 
     using (var sr = new StreamReader(fs)) { 
      // Read it... 
     } 

Nota el uso de FileShare.ReadWrite. Verifiqué que este código funciona mientras Excel tenía test.csv abierto.

Tenga cuidado con los problemas potenciales que invitará con esto, pueden ocurrir cosas raras cuando Excel escribe en el archivo justo cuando lo está leyendo. Es probable que lea basura, parte de datos antiguos, parte de los nuevos, sin una buena forma de diagnosticar esto.

0

Otra solución, sugerida por this answer, es copiar el archivo en un archivo temporal y abrirlo.

Uso

System.IO.File.Copy(sourcepath, copypath, false); 
Cuestiones relacionadas