Hallo zusammen,
ich möchte gerne eine Datei mit dem Befehl
FileStream fsSource = new FileStream(source, FileMode.Open);
öffnen.
Markiere ich die Datei als "Read only" führt das Programm diesen Befehl nicht aus.
Das Verhalten ist irgendwie "komisch", ich kann es nicht anderes schreiben.
Bedeutet, der Befehl wird übersprungen, da es keine Fehlermeldung und nix kommt.
Wenn ich einen Haltepunkt setze, wird die Zeile auch jedenfall bearbeitet, aber das wars.
Wenn ich die Datei auf "Read/Write" stelle, funktioniert es einwandfrei.
Hat jemand irgendeine Idee oder einen Hinweis, was ich noch machen könnte?
Danke
Bedeutet, der Befehl wird übersprungen, da es keine Fehlermeldung und nix kommt.
Das kann technisch nicht sein. Diese Zeile gibt immer eine Exception (durch Win32), wenn eine Datei geöffnet werden soll aber dies nicht geht.
Silent-Errors gibts hier nicht.
Technisch wird hier FileAccess.Read implizit ausgeführt, weil der Konstruktur FileStream(source, FileMode.Open)
nur ein Wrapper ist.
Siehe Source Code in https://github.com/microsoft/referencesource/blob/master/mscorlib/system/io/filestream.cs
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Sie können diesen Konstruktor nicht verwenden, um schreibgeschützte Dateien zu öffnen. Stattdessen müssen Sie einen Konstruktor verwenden, der einen- FileAccess Parameter akzeptiert, dessen Wert auf festgelegt ist FileAccess.Read .
Oh, guter Hinweis david!
Übersehen, dass der Source an der Stelle (mein letzter Beitrag) nicht FileAccess.Read verwendet, sondern FileShare.Read.
https://github.com/microsoft/referencesource/blob/5697c29004a34d80acdaf5742d7e699022c64ecd/mscorlib/system/io/filestream.cs#L440 und der Parameter davor FileAccess.ReadWrite implizit ist - nicht nur Read.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hat jemand irgendeine Idee oder einen Hinweis, was ich noch machen könnte?
Muss es wirklich FileStream sein?
Was hast du mit der Datei vor?
Wenn du Text auslesen möchstest, gibt's bspw.:
File.ReadAllText
Mit ReadAllText holt man sich aber den gesamten Inhalt in den Speicher, was oft gar nicht der gewollte Weg ist.
FileStream ist bewusst der zentrale Punkt des konzeptionellen Umgangs von IO
File IO improvements in .NET 6
-> Wenn möglich, arbeite mit FileStream.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Korrekt. Die Dateien können schonmal 1GB und mehr werden.
Da bin ich ganz der Meinung von Abt.
Ungeachtet dessen hab ich das Gefühl, dass Read Only hier mich nervt.
Hier mal der komplette Code:
FileStream fsDest = new FileStream(destination, FileMode.Create);
FileStream fsSource = new FileStream(source, FileMode.Open);
int readByte;
byte[] bt = new byte[1048756];
while ((readByte = fsSource.Read(bt, 0, bt.Length)) > 0)
{
fsDest.Write(bt, 0, readByte);
}
fsDest.Close();
fsSource.Close();
Mit Haltepunkt auf Zeile 2 und mit "F11" weitergehen, springt er direkt auf die letzte Zeile, wenn Read Only gesetzt ist.
Ich schnall das echt nicht...
Dann beachte doch einfach den Beitrag von david.m..?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ups, das war untergegangen. Ja, damit funktioniert es. Danke
Warum aber kein Exception kommt, wundert mich immer noch. Egal...
Hallo Krumnix,
Streams können auch kopiert werden -- siehe CopyTo
/ CopyToAsync
.
Bei async-Vorgängen mit Dateien ist auf das korrekte Erstellen des FileStreams mit der async-Angabe wichtig (bei Windows). Ob hier sync od. async besser ist kann ich nicht pauschal beurteilen, es sollte gemessen werden. Ev. lässt sich auch eine passendere Buffergröße verwenden, da die .NET Implementierung per Default eine gute Wahl darstellt, aber keine beste Wahl für "deine Hardware" sein muss.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"