FileCreate bei schreibgeschütztem Laufwerk
FileCreate bei schreibgeschütztem Laufwerk
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 ...
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 ...
-
- Beiträge: 6918
- 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
Sowas ähnliches hatte ich auch schon.
Evtl. funktioniert deine try/except nur, wen du deine EXE ausserhalb der IDE startest.
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
Mit Java und C/C++ sehe ich rot
- gladio
- Beiträge: 223
- 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
Welchen Sinn hat ein schreibgeschütztes Laufwerk, wenn jeder Dödel dann doch drauf schreiben kann?
Re: FileCreate bei schreibgeschütztem Laufwerk
Ich will ja nicht drauf schreiben, sondern testen, ob in ein Verzeichnis geschrieben werden kann um gegebenenfalls eine Datei woanders anzulegen!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?
Re: FileCreate bei schreibgeschütztem Laufwerk
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;
Re: FileCreate bei schreibgeschütztem Laufwerk
Danke für den Tipp, habe ihn gerade getestet, macht aber keinen Unterschied.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.
Re: FileCreate bei schreibgeschütztem Laufwerk
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.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;
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 (30.18 KiB) 7637 mal betrachtet
-
- Beiträge: 6918
- 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
Hast du die exe jetzt mal auserhalb der ide gestartet ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: FileCreate bei schreibgeschütztem Laufwerk
Ja, habe ich gemacht - macht keinen Unterschied.Mathias hat geschrieben: So 25. Okt 2020, 18:25 Hast du die exe jetzt mal auserhalb der ide gestartet ?
-
- Beiträge: 6918
- 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
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
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6918
- 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
Irgendwo in den Projekteijstellungen, gibt es CheckBox mit verschiedenen Prüfungen. Alles mal deaktivieren, inklusive Debugger.
Ist ein Versuch wert.
Ist ein Versuch wert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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
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
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).
Re: FileCreate bei schreibgeschütztem Laufwerk
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.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.
Re: FileCreate bei schreibgeschütztem Laufwerk
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.
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.
-
- Beiträge: 6918
- 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
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
Mit Java und C/C++ sehe ich rot