2017-09-07 1 views
2

Diese Zeile:Filestream kann nicht zum Lesen geöffnet werden, aber trotzdem kann ich die Datei kopieren?

using (FileStream fs = File.Open(src, FileMode.Open, FileAccess.Read, FileShare.Read)) 

wirft:

System.IO.IOException: Der Prozess kann nicht auf die Datei zugreifen 'X', weil es von einem anderen Prozess verwendet wird.

Wenn ich ersetzen Sie die Zeile mit:

File.Copy(src, dst, true); 
using (FileStream fs = File.Open(dst, FileMode.Open, FileAccess.Read, FileShare.Read)) 

es funktioniert.

Aber warum kann ich kopieren, die sicher den gesamten Inhalt der Datei liest, während die Datei direkt zu lesen beschränkt ist? Gibt es eine Problemumgehung?

+3

Was ist, wenn Sie 'FileShare verwenden.ReadWrite'? Wenn ein anderer Prozess Schreibzugriff hat, wird Ihre Anfrage fehlschlagen, wenn Sie nur den Lesezugriff zulassen. –

+0

@SamiKuhmonen Ja! Aber warum? Oh, ich sehe ... –

+0

Wenn es keine Duplikate für diese Frage gibt, löschen Sie es nicht. Es ist eine gültige Frage. –

Antwort

5

Wenn Sie eine Datei öffnen, wird nach Zugriffsmodi und Freigabemodi gesucht. Die Zugriffsmodi eines Prozesses müssen mit den Freigabemodi anderer Prozesse kompatibel sein. Wenn also A Lesezugriff benötigt, müssen andere im Freigabemodus gelesen haben. Gleiches zum Schreiben.

Wenn Prozess A eine Datei zum Schreiben geöffnet hat und Sie sagen SharingMode.Read wird der Aufruf fehlschlagen. Sie sagen in diesem Fall: "Andere dürfen nur aus der Datei lesen, nicht schreiben."

Wenn Sie ShareMode.ReadWrite angeben, sagen Sie "andere können lesen oder schreiben, ist mir egal" und wenn kein anderer Prozess ShareMode.Write angegeben hat, dürfen Sie aus der Datei lesen.

1

Aber warum ich kopieren kann, was sicherlich den ganzen Inhalt der Datei liest

Nun, konzeptionell liest es die gesamte Datei, wenn es auf einem niedrigeren Niveau als das Kopieren Strom passieren kann. Unter Windows ist es ein Aufruf an die Systemfunktion CopyFileEx, die Pfade übergeben. Auf * nix-Systemen verwendet es auch einen Systemaufruf, aber öffnet die Quelldatei mit FileAccess.Read, FileShare.Read für diesen Aufruf, so dass Sie das gleiche Problem haben würden.

während das Lesen der Datei eingeschränkt ist?

Wenn eine Datei geschrieben werden kann, dann können Sie es nicht FileShare.Read öffnen, weil irgendwann zwischen den verschiedenen Operationen, die Sie die Datei tun könnte geändert werden und Ihre Operationen werden die falschen Ergebnissen führen.

CopyFileEx kann erfolgreich ausgeführt werden, indem verhindert wird, dass Schreibvorgänge, die während der kurzen Betriebsdauer auftreten, die Ergebnisse beeinträchtigen. Es gäbe keine Möglichkeit, eine allgemeinere Form anzubieten, denn es gibt keine Möglichkeit zu wissen, dass Sie den Strom schnell wieder schließen werden.

Gibt es einen Workaround?

Ein Workaround für was? Dass Sie einen Stream nicht öffnen können oder dass Sie die Datei kopieren können? Für das erstere bietet das letztere eine solche Problemumgehung: Kopieren Sie die Datei, um einen Schnappschuss davon zu erhalten, obwohl es nicht garantiert ist.

+0

Danke für die Erklärung, ich habe 'FileShare.Read' für' FileShare.ReadWrite' einfach so verwechselt, dass 'FileShare.ReadWrite' das Problem für mich behebt. –

Verwandte Themen