2010-04-19 4 views
9

Tengo este código que guarda un archivo pdf.FileStream para guardar el archivo y luego desbloquearlo inmediatamente en .NET?

FileStream fs = new FileStream(SaveLocation, FileMode.Create); 
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
fs.Flush(); 
fs.Close(); 

Funciona bien. Sin embargo, a veces no libera el bloqueo de inmediato y eso causa excepciones de bloqueo de archivos con funciones que se ejecutan después de esta ejecución.

¿Hay una forma ideal para liberar el bloqueo de archivo justo después de lafs.Close()

+1

¿Está el archivo en un disco duro local o en un recurso compartido de red? ¿Tiene algún software antivirus instalado? –

Respuesta

16

Aquí es el ideal:

using (var fs = new FileStream(SaveLocation, FileMode.Create)) 
{ 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 

que es más o menos equivalente a:

FileStream fs = null; 
try 
{ 
    fs = new FileStream(SaveLocation, FileMode.Create); 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 
finally 
{ 
    if (fs != null) 
    { 
     ((IDisposable)fs).Dispose(); 
    } 
} 

siendo el using más legible.


ACTUALIZACIÓN:

@aron, ahora que lo pienso

File.WriteAllBytes(SaveLocation, result.DocumentBytes); 

se ve aún más bonita a la vista que el :-) ideales

+9

Este es un gran ejemplo de cómo usar la instrucción 'using', pero dado que en última instancia es equivalente al código del OP, no hace nada para responder a la pregunta que se hizo. –

+3

@Jeffrey, sé que bebo mucha cerveza pero realmente no veo cómo esto es equivalente al código OPs. –

+5

Eliminar llamadas Cerrar. Cerrar llamadas Flush. El resultado final es el mismo.Su cambio es benéfico para evitar dejar accidentalmente abierto el archivo en el caso de excepciones o devoluciones anticipadas, pero no hace que el bloqueo de archivos se elimine más rápido. –

3

No me puedo imaginar por qué el bloqueo se mantendrá después de que el archivo se cierre. Sin embargo, usted debe considerar envolver esto en un usando DECLARACIÓN para asegurarse de que el archivo se cierra incluso si se produce una excepción

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create)) 
{ 
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length); 
} 
3

Si las funciones que se ejecutan después de ésta son parte de la misma aplicación, a continuación, un mejor enfoque podría debe abrir el archivo para lectura/escritura al comienzo de todo el proceso, y luego pasar el archivo a cada función sin cerrarlo hasta el final del proceso. Entonces no será necesario que la aplicación bloquee la espera para que se complete la operación IO.

5

Hemos visto este mismo problema en producción con una sentencia using() envolviéndolo.

Uno de los principales culpables aquí es un software antivirus que puede colarse después de que se cierra el archivo, tómelo para verificar que no contenga un virus antes de soltarlo.

Pero incluso con todos los programas antivirus fuera de la mezcla, en los sistemas de carga muy alta con archivos almacenados en recursos compartidos de red, seguimos viendo el problema ocasionalmente. A, tos, hilo corto. Sueño(), tos, después del cierre pareció curarlo. Si alguien tiene una mejor solución ¡me encantaría escucharla!

+0

¿Cuántos milisegundos recomendaría? – kpozin

+0

Es difícil recomendar un valor específico ya que dependerá de muchos factores; empiece pequeño, digamos 10. –

1

Esto funcionó para mí cuando usé .Flush() Tuve que agregar un cierre dentro de la instrucción using.

using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite)) 
{ 
    imageFile.Write(bytes, 0, bytes.Length); 
    imageFile.Flush(); 
    imageFile.Close(); 
    } 
+0

Tuve que hacer lo mismo cuando uso 'WhiteAsync' dentro de' using' también. – codenamezero

Cuestiones relacionadas