2010-04-19 5 views
9

Ich habe diesen Code, der eine PDF-Datei speichert.FileStream zum Speichern von Datei sofort entsperren in .NET?

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

Es funktioniert gut. Manchmal gibt es die Sperre jedoch nicht sofort frei, und dies führt zu Dateisperrungsausnahmen mit Funktionen, die nach diesem einen Lauf ausgeführt werden.

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

+1

Ist die Datei auf einer lokalen Festplatte oder einem Netzwerk freigegeben? Haben Sie eine Antivirensoftware installiert? –

Antwort

16

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

die using besser lesbar.


UPDATE:

@aron, jetzt, da ich denke

File.WriteAllBytes(SaveLocation, result.DocumentBytes); 

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

+9

Dies ist ein großartiges Beispiel dafür, wie man die 'using'-Anweisung verwendet, aber da sie letztendlich dem OP-Code entspricht, wird die Frage, die gestellt wurde, nicht beantwortet. –

+3

@ Jeffrey, Ich weiß, dass ich viel Bier trinke, aber ich sehe wirklich nicht, wie dies dem OP-Code entspricht. –

+5

Anrufe verwerfen Schließen. Anrufe schließen Das Endergebnis ist das gleiche.Ihre Änderung ist vorteilhaft, um zu vermeiden, dass die Datei im Falle von Ausnahmen oder vorzeitigen Rückgaben versehentlich geöffnet bleibt. Dies führt jedoch nicht dazu, dass die Dateisperre schneller entfernt wird. –

3

Ich kann mir nicht vorstellen warum die Sperre beibehalten würde, nachdem die Datei geschlossen wurde. Aber Sie sollten wickeln diese in einem mit statment prüfen, um sicherzustellen, dass die Datei auch geschlossen, wenn eine Ausnahme

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

Wenn die Funktionen, die nach diesem Lauf Teil derselben Anwendung sind, dann ist ein besserer Ansatz könnte Sie können die Datei zu Beginn des gesamten Prozesses zum Lesen/Schreiben öffnen und dann die Datei an jede Funktion übergeben, ohne sie bis zum Ende des Prozesses zu schließen. Dann muss die Anwendung nicht mehr warten, bis der IO-Vorgang abgeschlossen ist.

5

Wir haben dieses gleiche Problem in der Produktion mit einer using() -Anweisung, die es einhüllt, gesehen.

Einer der Haupttäter hier ist Anti-Virus-Software, die sich einschleichen kann, nachdem die Datei geschlossen ist, greifen Sie, um zu überprüfen, dass es keinen Virus enthält, bevor Sie es freigeben.

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

+0

Wie viele Millisekunden würden Sie empfehlen? – kpozin

+0

Schwer zu empfehlen einen bestimmten Wert, da es von einer Vielzahl von Faktoren abhängt; Beginne klein, sprich 10. –

1

Dies funktionierte für mich bei der Verwendung von .Flush() Ich musste ein Schliessen innerhalb der using-Anweisung hinzufügen.

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

Ich musste das gleiche tun, wenn ich 'WhiteAsync' auch in' using' verwende. – codenamezero

Verwandte Themen