FileStream para guardar el archivo a continuación, desbloquear de inmediato en .NET?

StackOverflow https://stackoverflow.com/questions/2670429

  •  28-09-2019
  •  | 
  •  

Pregunta

Tengo este código que guarda un archivo PDF.

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

Se trabaja muy bien. Sin embargo a veces no libera el bloqueo de inmediato y que las causas archivo de excepciones con funciones de bloqueo ejecuta después de esto una carrera.

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

¿Fue útil?

Solución

Aquí está 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();
    }
}

usando ser más legible.


ACTUALIZACIÓN:

@aron, ahora que estoy pensando

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

apariencia aún más bonita a la vista que el ideal: -)

Otros consejos

Hemos visto este mismo problema en la producción con un uso de () estado de envolverlo.

Uno de los principales culpables aquí es el software anti-virus que puede colarse después de que el archivo se cierra, lo agarra para comprobar que no contiene un virus antes de soltarlo.

Pero incluso con todo el software antivirus fuera de la mezcla, en los sistemas de carga muy altas con los archivos almacenados en recursos compartidos de red que todavía vio el problema de vez en cuando. Una tos, corta Thread.Sleep (), tos, después del cierre parecía curarla. Si alguien tiene una solución mejor que me encantaría escucharlo!

No puedo imaginar por qué el bloqueo se mantiene después de cerrar el archivo. Sin embargo, usted debe considerar envolver esto en un DECLARACIÓN utilizando 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);  
}

Si las funciones que se ejecutan después de éste forman parte de la misma aplicación, a continuación, un mejor enfoque podría ser la de abrir el archivo para lectura / escritura en el inicio de todo el proceso, y luego pasar el archivo a cada función sin cerrar hasta el final del proceso. Entonces será necesario que la solicitud para bloquear la espera de la operación IO completa.

Esto funcionó para mí cuando se utiliza .Flush () he tenido que añadir una estrecha 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();
  }

Sólo tenía el mismo problema cuando cerraba un FileStream y abrir el archivo inmediatamente en otra clase. La instrucción using no era una solución ya que el FileStream había sido creado en otro lugar y se almacenan en una lista. Borrar la lista no era suficiente.

Parece que la corriente tiene que ser liberado por el recolector de basura antes de que el archivo se puede volver a utilizar. Si el tiempo entre el cierre y la apertura es demasiado corto, puede utilizar

GC.Collect();

justo después de que cerró la corriente. Esto funcionó para mí.

supongo que las soluciones de Ian Mercer para poner el hilo a dormir podría tener el mismo efecto, dando tiempo al GC para liberar los recursos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top