Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
FileStream Verhalten bei "Read only"
Krumnix
myCSharp.de - Member



Dabei seit:
Beiträge: 123
Herkunft: Schweiz

Themenstarter:

FileStream Verhalten bei "Read only"

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat von Krumnix
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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
david.m
myCSharp.de - Member



Dabei seit:
Beiträge: 115

beantworten | zitieren | melden

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_
Zitat
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 .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
aime2code
myCSharp.de - Member



Dabei seit:
Beiträge: 50

beantworten | zitieren | melden

Zitat von Krumnix
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Krumnix
myCSharp.de - Member



Dabei seit:
Beiträge: 123
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Dann beachte doch einfach den Beitrag von david.m..?
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Krumnix
myCSharp.de - Member



Dabei seit:
Beiträge: 123
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Ups, das war untergegangen. Ja, damit funktioniert es. Danke
Warum aber kein Exception kommt, wundert mich immer noch. Egal...
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7559
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers