Frage

Ich habe diesen Code, der eine PDF-Datei gespeichert werden.

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

Es funktioniert gut. Doch manchmal entbindet es nicht die Sperre sofort und dass Ursachen Datei Ausnahmen mit Funktionen ausführen, nachdem dieser einen Lauf zu verriegeln.

Gibt es eine ideale Möglichkeit, die Dateisperre freizugeben direkt nach dem fs.Close ()

War es hilfreich?

Lösung

Hier ist das ideal:

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

was in etwa entspricht:

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();
    }
}

mit mehr lesbar ist.


UPDATE:

@aron, jetzt, da ich denke

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

sieht noch schöner für das Auge als das Ideal: -)

Andere Tipps

Wir haben das gleiche Problem in der Produktion mit einer () verwendet Aussage Verpackung gesehen.

Eines der Top-Täter hier ist ein Anti-Virus-Software, die in schleichen kann, nachdem die Datei geschlossen wird, greifen sie es überprüft nicht, einen Virus enthalten, bevor sie freigegeben wird.

Aber auch mit allen Antiviren-Software aus dem Mix, in sehr hohen Lastsysteme mit gespeicherten Dateien auf Netzwerkfreigaben sahen wir noch das Problem gelegentlich. A, Husten, kurz Thread.Sleep (), Husten, nach dem Ende es zu heilen schien. Wenn jemand eine bessere Lösung hat würde ich gerne hören!

Ich kann mich nicht vorstellen, warum die Sperre aufrechterhalten werden würde, nachdem die Datei geschlossen wird. Aber Sie sollten wickeln diese in einem mit statment prüfen, um sicherzustellen, dass die Datei auch geschlossen, wenn eine Ausnahme ausgelöst wird,

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

Wenn die Funktionen dieses Durchlauf nach diesem Teil der gleichen Anwendung ist, dann ist ein besserer Ansatz könnte sein, die Datei zu öffnen, für Schreib- / Lese zu Beginn des gesamten Prozesses, und dann die Datei ohne Schließung zu jeder Funktion übergeben es bis zum Ende des Prozesses. Dann wird es nicht notwendig sein, wenn die Anwendung für den IO-Betrieb, um eine vollständige warten zu blockieren.

Das ist für mich gearbeitet bei der Verwendung von .Flush () Ich hatte eine enge innerhalb der using-Anweisung hinzuzufügen.

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

Gerade hatte das gleiche Problem, wenn ich einen Filestream geschlossen und öffnete die Datei sofort in einer anderen Klasse. Die using-Anweisung war keine Lösung, da der Filestream hatte an einem anderen Ort gespeichert und in einer Liste erstellt. Löschen der Liste war nicht genug.

Es sieht aus wie der Strom vom Garbage Collector freigegeben werden muss, bevor die Datei wiederverwendet werden kann. Wenn die Zeit zwischen dem Schließen und Öffnen zu kurz ist, können Sie

GC.Collect();

rechts, nachdem Sie den Stream geschlossen. Das funktioniert für mich.

ich die Lösungen von Ian Mercer erraten, den Faden zu schlafen legen könnte die gleiche Wirkung hat, die GC Zeit, um die Ressourcen freizugeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top