Es gibt grundsätzlich zwei Möglichkeiten, Pfadnamen zu spezifizieren:
Strings sind offensichtlich auf der Plattform abhängig: Unix Syntax und Windows-Syntax zum Beispiel.
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
Sie können einen Pfad Objekt aus einem String erstellen:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
Die #p oben stellt sicher, dass ein Pfadobjekt (und kein String) erstellt wird, wenn Sie es wieder lesen.
? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"
also intern Common Lisp arbeitet mit Pfadnamen Objekten, aber es kann Sie normale Strings verwenden und macht aus ihnen Pfadnamen Objekte, wenn nötig.
Wenn Common Lisp einen Pfadnamen sieht, der nicht alle Komponenten enthält (z. B. das Verzeichnis fehlt), füllt es die Komponenten aus dem Objekt pfadname aus, das den Wert der Variable * DEFAULT-PATHNAME-DEFAULTS * enthält.
Mit der Funktion beschreiben, die Sie bei den Komponenten eines Pfadname aussehen kann (hier Clozure CL):
? (describe (pathname "/Users/bar/*.text"))
#P"/Users/bar/*.text"
Type: PATHNAME
Class: #<BUILT-IN-CLASS PATHNAME>
TYPE: (PATHNAME . #<CCL::CLASS-WRAPPER PATHNAME #x3000401D03BD>)
%PATHNAME-DIRECTORY: (:ABSOLUTE "Users" "bar")
%PATHNAME-NAME: :WILD
%PATHNAME-TYPE: "text"
%PHYSICAL-PATHNAME-VERSION: :NEWEST
%PHYSICAL-PATHNAME-DEVICE: NIL
- die Lisp-Funktionen Erstellen Pfadname
MAKE-PATHNAME Objekte mit ist die Funktion und es braucht ein paar Schlüsselwortargumente, um die Komponenten zu spezifizieren.
Manchmal ist es auch sinnvoll, einen neuen Pfad auf einer bestehenden Basis zu schaffen:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
Wenn Sie Verzeichnis es sinnvoll ist, einen Pfad mit Platzhalter zu verwenden. DIRECTORY gibt dann eine Liste passender Pfadnamen zurück. Der Name 'DIRECTORY' ist leicht irreführend, da DIRECTORY nicht den Inhalt eines Verzeichnisses auflistet, sondern die passenden Pfadnamen für (normalerweise) einen Pfadnamen mit Platzhaltern auflistet. Die Platzhalter können eine Folge von Zeichen in Komponenten wie /foo/s*c/list*.l* "enthalten. Es gibt auch den Platzhalter **, mit dem Teile einer Verzeichnishierarchie wie/foo/** abgeglichen werden. /test.lisp, das passt auf alle Dateien test.lisp unter dem Verzeichnis foo und dessen Unterverzeichnissen.
(directory "/Users/foo/Lisp/**/*.lisp")
oben in eine Liste aller 'Lispeln' Dateien '/ Users/foo/Lisp /' zurückkehren sollte und alle seine Unterverzeichnisse
die .c-Dateien in einem einzigen Verzeichnis verwenden, um zurückzukehren.
(directory "/Users/foo/c/src/*.c")
Beachten Sie, dass DIRE CTORY gibt eine Liste von Pfadnamen-Objekten zurück (keine Liste von Strings).
? (directory (make-pathname
:name "md5"
:type :wild
:directory '(:absolute "Lisp" "cl-http" "cl-http-342" "server")))
(#P"/Lisp/cl-http/cl-http-342/server/md5.lisp"
#P"/Lisp/cl-http/cl-http-342/server/md5.xfasl")
Oben verwendet ein Pfadname-Objekt, das von MAKE-PATHNAME erstellt wird. Es gibt alle Dateien zurück, die mit /Lisp/cl-http/cl-http-342/server/md5.* übereinstimmen.
Dies ist das gleiche wie:
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
, die kürzer ist, hängt aber von der Unix Pfadsyntax.
Yep für mich gearbeitet - (Verzeichnis "Pfad") zurück NIL, wo (Verzeichnis "Pfadname /*.*" gab mir die erwarteten Ergebnisse. – Justicle
Sie benötigen nur Dateien mit Namen, die einen Punkt enthalten? – Svante
Komisch, nicht wahr? Ich bin eigentlich nach .h und .cpp Dateien, aber "Pfadname/*" gibt NIL zurück. – Justicle