2008-10-15 20 views
14

estoy tratando de utilizar un StreamReader para leer un archivo, pero siempre está en uso por otro proceso por lo que obtener este error:¿Puedo simplemente 'leer' un archivo que está en uso?

The process cannot access the file '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS' because it is being used by another process.

¿Hay alguna manera de que pueda leer esto sin copiarlo? ¿O es esa mi única opción?

Respuesta

25

Puede leer el archivo solo si el programa que abrió el archivo especificó primero los derechos de lectura compartida en ese archivo.

Sin embargo, si el archivo no tiene derechos de lectura compartida, no podrá copiarlo en primer lugar.

Es posible que no pueda acceder a un archivo si está especificando un derecho de uso compartido que entra en conflicto con el derecho de uso compartido de un programa que ya tiene el archivo abierto. Por ejemplo, no puede otorgar acceso de escritura si el programa que ya lo tiene abierto no otorga acceso de escritura.

Si el programa que abrió el archivo en primer lugar es compatible con Volume Shadow Copy (VSS), también puede usar VSS para obtener acceso al archivo.

Hay controladores de software comerciales que le permiten acceder a dichos archivos, incluso cuando están en uso. Usted solía ser capaz de obtener Open File Manager por St-Bernards, y también puede usar File Access Manager (FAM) de VisionWorks Solutions Inc. Estos controladores suelen ser OEM para hacer copias de seguridad de las compañías de software para incluirlas en sus productos.

VSS funciona diciendo al programa que ya tiene el archivo abierto que otro programa desea leer del archivo. VSS luego hace una copia del archivo y le permite leer de esta copia. VSS no funciona para aplicaciones heredadas.

FAM funciona de forma transparente para programas antiguos y no heredados al especificar una "lista permitida" de aplicaciones que pueden acceder exclusivamente a archivos abiertos y bloqueados. Solo los programas en esta lista tienen acceso a estos archivos. Cuando se abre un archivo, entra en el modo de caché para que obtenga una copia del archivo tal como estaba cuando se inició la 'copia de seguridad/apertura' del archivo. En este punto, el programa que abrió originalmente el archivo ve el archivo como realmente es, y el segundo programa en la lista permitida, ve el archivo tal como estaba cuando ocurrió la 'apertura/copia de seguridad' del archivo. Esto asegura la consistencia del archivo.

2

pruebe el siguiente código.

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
fileStream = new StreamReader(fileStr); 

Lo he probado en Windows XP. Si el archivo ya está abierto en modo escritura en algún otro proceso & no ha especificado derechos de uso compartido, aún podrá abrir el archivo en modo de lectura.

Descargo de responsabilidad: funciona, pero entonces, no estoy seguro de si debe usarlo en el código de producción. Todavía no puedo encontrar ninguna documentación formal que diga que debería funcionar.

Cuestiones relacionadas