c# .net windows directory system.io.directory

c# - Directory.CreateDirectory Latency Issue?



.net windows (3)

Aunque nunca he experimentado este comportamiento y no puedo explicarlo, una solución pragmática es configurar un bucle alrededor de su llamada accediendo al directorio. Capture DirectoryNotFoundException dentro de ese bucle y vuelva a intentar el acceso algunas veces después de una breve pausa cada vez. Retome la excepción si se excede el recuento de reintentos.

Agregar un registro detallado en este punto puede ayudarlo a determinar la causa real del problema.

Intento crear un directorio remoto y luego escribir un archivo en él. De vez en cuando, la aplicación falla con System.IO.DirectoryNotFoundException cuando intenta escribir el archivo.

Cuando escribo el archivo, uso el objeto devuelto DirectoryInfo para ayudar a crear la ruta del archivo, por lo que la aplicación parece pensar que el directorio se ha creado. Sin embargo, el directorio no existe.

¿Hay alguna posibilidad de que intente escribir en el directorio antes de que Windows haya terminado de crearlo? Creo que Directory.CreateDirectory no volvería hasta que esta tarea haya terminado.


Respuesta - Sí. El comportamiento, cuando se espera la creación de archivos / directorios, es esperado. La solución ordinaria propuesta por el otro comentarista es usar reintentos con algún tiempo de espera. El comportamiento es el mismo independientemente de las funciones de archivo utilizadas: Findfirst, CreateFile, WaitForSingleObject, etc.

Otra solución será usar nuevas funciones transaccionales de la API que se encuentran en Windows Vista y posteriores.

El problema es desagradable y nunca fue entendido por los desarrolladores de proyectos intensivos en archivos hechos en otras plataformas y movidos a Windows: como scripts DOS / CMD, clientes SVN, Cygwin, perl, varias aplicaciones Java, varios instaladores, etc.


Acabo de tener este problema y para mí la situación era así:

if(!exportDirectory.Exists) exportDirectory.Create();

Luego, más adelante, cuando en otra clase que tiene este mismo objeto DirectoryInfo pasado a él, hago un:

if (!exportDirectory.Exists) throw new DirectoryNotFoundException(exportDirectory.FullName);

Y el directorio aparentemente todavía no existe (aunque tengo el directorio principal abierto en Windows y, por supuesto, puedo verlo justo en frente de mí).

La solución que encontré es después de la creación inicial del directorio al que debería llamar:

exportDirectory.Refresh();

De Microsoft:

Refresca el estado del objeto. (Heredado de FileSystemInfo).