Manchmal trifft man sich ja zwei mal ... im Leben ... im Universum und ... im allgemeinen.
Oder das selbe Problem trifft auf einen zwei Mal.
Code:
(setq outfile "c:/temp/xxx.csv")
(with-open-file
(out outfile
:Direction :Output :external-format :ansi
:if-does-not-exist :create :if-exists :append)
(format out "Test")
)
Ich habe jenen Code Schnipsel noch mal in die Hand genommen und Fehler mit nicht existierenden Datei / Verzeichnisname etc. provoziert, um die Fehler-Meldung genau zu lesen.
Einer der TestCases war dann
Code:
(setq outfile "c:/temp/xxx-readonly.csv") ;; made RO in file system
Und die Fehlermeldung dazu: => "
LISP error: Cannot append to the file c:/temp/xxx-readonly.csv."
Es ging also nich mehr um existiert oder nicht. Sondern um den Status der Datei.
Und da machte es bei mir 'klick' => Geschwind in die IKIT Dokumentation geguckt:
=> sd-inq-file-status und schon geht's ab:
Code:
;; file readonly:
(oli::sd-inq-file-status outfile :write-access) =>> nil;; file writeable:
(oli::sd-inq-file-status outfile :write-access) =>> T | :INTERNAL | "C:\\temp\\xxx.csv"
Dann habe ich Michael Anwendungsfall angewandt:
Code:
;; writeable + in Excel geöffnet:
(oli::sd-inq-file-status outfile :write-access) =>> NIL;; writeable + in Excel wieder geschlossen:
(oli::sd-inq-file-status outfile :write-access) =>> T | :INTERNAL | "C:\\temp\\xxx.csv"
;; not existing:
(setq outfile "c:/temp/xxx-notexist.csv")
(oli::sd-inq-file-status outfile :write-access) =>> T | :INTERNAL | "C:\\temp\\xxx-notexist.csv"
Und jetzt machte zum ersten mal sd-inq-file-status für mich auch Sinn.
Denn (probe-file "file-name") war immer viel kürzer zu schreiben
als (oli::sd-inq-file-status "file-name" :existence) , aber :write-access habe ich nie angewandt.
-------------------------------
Keine Ahnung wieviele 100 Male ich (with-open-file ... :Direction :Output) in Lisp Files geschrieben habe. Aber das hat immer fein funktioniert.
-------------------------------
@Michael du kannst jene code Stelle also bei Dir vereinfachen:
Code:
(setq outfile "c:/temp/xxx.csv")
(if (sd-inq-file-status outfile :write-access)
(with-open-file
(out outfile
:Direction :Output :external-format :ansi
:if-does-not-exist :create :if-exists :append)
(format out "Test")
)
;; else
(sd-display-alert (format nil "Kein Schreibzugriff auf Datei ~A" outfile))
)
Das sieht doch kompakter aus als ein sd-call-cmds mit :failure form!
------------------
● Firefox ESR ● Java Forum Stuttgart JUGS ● OSD Hilfeseite (de) / help page (en) ● NotePad++ ● BuFDi ●
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP