FileCreate bei schreibgeschütztem Laufwerk

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

Liebe Alle,

ich möchte testen, ob ich in einem Ordner eine Datei anlegen kann. Wenn ich dazu FileCreate verwende und der Zielpfad auf einem schreibgeschützten Laufwerk liegt (z.B. schreibgeschützte SD-Karte), bekomme ich die Nachricht "Der Datenträger ist schreibgeschützt und kann nicht beschrieben werden. Entfernen Sie den Schreibschutz vom Datenträger in Laufwerk F:." mit den Schaltflächen "Abbrechen", "Wiederholen" und "Weiter".

Es ist mir nicht gelungen, diese Fehlermeldung mit try/except abzufangen - sie kommt immer! Was übersehen ich hier?

Danke und viele Grüße,
Christian

PS: "DirectoryIsWritable" aus den LazFileUtils macht intern auch nur FileCreate, ist also hier auch keine Hilfe ...

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von Mathias »

Sowas ähnliches hatte ich auch schon.

Evtl. funktioniert deine try/except nur, wen du deine EXE ausserhalb der IDE startest.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von gladio »

Welchen Sinn hat ein schreibgeschütztes Laufwerk, wenn jeder Dödel dann doch drauf schreiben kann?

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

gladio hat geschrieben:
So 25. Okt 2020, 15:25
Welchen Sinn hat ein schreibgeschütztes Laufwerk, wenn jeder Dödel dann doch drauf schreiben kann?
Ich will ja nicht drauf schreiben, sondern testen, ob in ein Verzeichnis geschrieben werden kann um gegebenenfalls eine Datei woanders anzulegen!

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von wp_xyz »

Hast du auch mal den alten, klassichen Weg mit IOResult versucht? Also:

Code: Alles auswählen

function CanCreateFile(AFileName: String): Boolean;
var
  F: File;
 begin
  AssignFile(F, AFileName);
  {$I-}
  Rewrite(F);
  {$I+}
  Result := IOResult = 0;
  if Result then DeleteFile(AFileName);
end;  

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

Mathias hat geschrieben:
So 25. Okt 2020, 15:09
Sowas ähnliches hatte ich auch schon.

Evtl. funktioniert deine try/except nur, wen du deine EXE ausserhalb der IDE startest.
Danke für den Tipp, habe ihn gerade getestet, macht aber keinen Unterschied.

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

wp_xyz hat geschrieben:
So 25. Okt 2020, 16:03
Hast du auch mal den alten, klassichen Weg mit IOResult versucht? Also:

Code: Alles auswählen

function CanCreateFile(AFileName: String): Boolean;
var
  F: File;
 begin
  AssignFile(F, AFileName);
  {$I-}
  Rewrite(F);
  {$I+}
  Result := IOResult = 0;
  if Result then DeleteFile(AFileName);
end;  
Danke für den Code, ich habe ihn gerade versucht, es zeigt sich genau das gleiche Verhalten. Die Zeile mit "Rewrite" erzeugt die Fehlermeldung. Es macht keinen Unterschied, ob ich das Rewrite in {$I-} und {$I+} einbette oder zwischen try/except.

Wenn ich versuche, auf eine schreibgeschützte Datei mit Rewrite zuzugreifen, funktioniert es so wie erhofft. Nur bei einem schreibgeschützten Laufwerk kommt die Fehlermeldung. Ich teste das, indem ich eine Datei auf einer mit Schreibschutzschalter geschützten SD-Karte im Kartenleser anlegen möchte (das war die schnellste Variante, die mir eingefallen ist, um zu testen, wie sich mein Programm verhält, wenn es von einem Reead-Only-Datenträger gestartet wird).

Im Anhang übrigens ein Screenshot der Fehlermeldung.
Dateianhänge
Screenshot.jpg
Screenshot.jpg (30.18 KiB) 4454 mal betrachtet

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von Mathias »

Hast du die exe jetzt mal auserhalb der ide gestartet ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

Mathias hat geschrieben:
So 25. Okt 2020, 18:25
Hast du die exe jetzt mal auserhalb der ide gestartet ?
Ja, habe ich gemacht - macht keinen Unterschied.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von Mathias »

Ich mag mich an das $I Problem errinnern, irgend etwas musste man umstellen, aber was es war.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von Mathias »

Irgendwo in den Projekteijstellungen, gibt es CheckBox mit verschiedenen Prüfungen. Alles mal deaktivieren, inklusive Debugger.
Ist ein Versuch wert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von af0815 »

Das einzige was mir dazu unter Windows einfällt ist, das BS selbst zu fragen. ZB. WinAPI GetVolumeInformationA und dort lpFileSystemFlags. Dann sollte man herausfinden können ob das FS generell RO ist.
https://docs.microsoft.com/en-us/window ... formationa
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

Mathias hat geschrieben:
So 25. Okt 2020, 19:24
Irgendwo in den Projekteijstellungen, gibt es CheckBox mit verschiedenen Prüfungen. Alles mal deaktivieren, inklusive Debugger.
Ist ein Versuch wert.
Das habe ich in den Projekteinstellungen auf der Seite "Debuggen" unter der Überschrift "Überprüfungen" gefunden. Dort gibt es I/O, Bereich, Überlauf, Stack, Methodenaufrufe prüfen und Code für Assertions einfügen. Ist alles bereits deaktiviert.

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von cgaertner »

Ich habe jetzt eine Lösung gefunden!

Wenn ich vor dem Rewrite (siehe Demo-Funktion von wp_xyz) ...
SetErrorMode(SEM_FAILCRITICALERRORS);
... setze, dann kann ich den Fehler mit try/except abfangen. Dann brauche ich nicht einmal ein {$I-} und {$I+}, sondern nur try/except.

Aus der Microsoft Dokumentation:
SEM_FAILCRITICALERRORS
The system does not display the critical-error-handler message box. Instead, the system sends the error to the calling process.
Best practice is that all applications call the process-wide SetErrorMode function with a parameter of SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application.


Komisch, daß ich das bisher noch nie gebraucht habe ...

Da das eine Windows-Funktion ist, muß ich jetzt mal schauen, wie sich das Ganze unter Linux verhält.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: FileCreate bei schreibgeschütztem Laufwerk

Beitrag von Mathias »

Dieses Miniprogramm spuckt bei mir unter Linux Fehler: 5 aus.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  f: file;
  i: Word;
begin
  AssignFile(f, '/root/test.txt');
  {$i-}
  Rewrite(f);
  i := IOResult;
  if i <> 0 then
    ShowMessage('Fehler: ' + IntToStr(i));
  CloseFile(f);
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten