c# - ¿Puedo simplemente ''leer'' un archivo que está en uso?
file file-io (2)
Intento usar un StreamReader para leer un archivo, pero siempre lo uso en otro proceso, así que me sale este error:
El proceso no puede acceder al archivo ''/ arfjwknasgmed17 / C $ / FLAG CONDITION / CP-ARFJN-FLAG.XLS'' porque lo está utilizando otro proceso.
¿Hay alguna manera de que pueda leer esto sin copiarlo? ¿O es esa mi única opción?
Puede leer el archivo solo si el programa que abrió el archivo primero especificó 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 comercial que le permiten acceder a dichos archivos, incluso cuando están en uso. Solía ser capaz de obtener Open File Manager de 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 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 heredados 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.
prueba 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 de escritura por algún otro proceso y no ha especificado los derechos de uso compartido, aún podrá abrir el archivo en modo de lectura.
Descargo de responsabilidad: Funciona, pero luego, 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.