Laden...

FileStream Verhalten bei "Read only"

Erstellt von Krumnix vor 2 Jahren Letzter Beitrag vor 2 Jahren 502 Views
K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 2 Jahren
FileStream Verhalten bei "Read only"

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

16.835 Beiträge seit 2008
vor 2 Jahren

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

D
152 Beiträge seit 2013
vor 2 Jahren

Siehe Doku https://docs.microsoft.com/de-de/dotnet/api/system.io.filestream.-ctor?view=net-5.0#System_IO_FileStream__ctor_System_String_System_IO_FileMode_

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 .

16.835 Beiträge seit 2008
vor 2 Jahren

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.

A
49 Beiträge seit 2007
vor 2 Jahren

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

16.835 Beiträge seit 2008
vor 2 Jahren

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.

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 2 Jahren

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...

16.835 Beiträge seit 2008
vor 2 Jahren

Dann beachte doch einfach den Beitrag von david.m..?

K
Krumnix Themenstarter:in
129 Beiträge seit 2018
vor 2 Jahren

Ups, das war untergegangen. Ja, damit funktioniert es. Danke
Warum aber kein Exception kommt, wundert mich immer noch. Egal...

6.911 Beiträge seit 2009
vor 2 Jahren

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!"