Istnieją dwa sposoby określania ścieżek:
Struny są oczywiście w zależności od platformy: Unix składnia vs. składni Windows dla przykładu.
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
Można utworzyć obiekt ścieżki dostępu z ciągiem:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
#p powyżej zapewnia, że obiekt ścieżka (a nie łańcuch) jest tworzony, kiedy czytasz go z powrotem.
Wewnętrznie Common Lisp pracuje z obiektami ścieżek, ale pozwala używać normalnych ciągów znaków i tworzy obiekty ścieżek z nich, jeśli to konieczne.
Kiedy Common Lisp widzi ścieżkę, która nie zawiera wszystkich określonych składników (na przykład brakuje katalogu), to wypełnia komponenty z obiektu pathname, który jest wartością zmiennej * DEFAULT-PATHNAME-DEFAULTS *.
Dzięki funkcji DESCRIBE może obejrzysz składników ścieżki (tutaj 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
- pomocą funkcji Lisp tworzenia ścieżka obiektów
make-PathName jest funkcją i wymaga kilku argumentów ze słowem kluczowym, aby określić składniki.
Czasami jest również przydatna, aby utworzyć nową ścieżkę w oparciu o już istniejącą:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
Jeśli używasz DIRECTORY warto używać ścieżki z symboli wieloznacznych. DIRECTORY następnie zwróci listę pasujących nazw ścieżek. Nazwa "KATALOG" jest nieco myląca, ponieważ DIRECTORY nie wyświetla zawartości katalogu, ale podaje listę pasujących nazw ścieżek (zwykle) ścieżek zawierających symbole wieloznaczne. Symbole wieloznaczne mogą odpowiadać ciągom znaków w komponentach, takich jak /foo/s*c/list*.l*. "Istnieje również dzika karta **, która służy do dopasowywania części hierarchii katalogów takich jak/foo/** /test.lisp, który pasuje do wszystkich plików test.lisp pod foo katalogu i jego podkatalogów.
(directory "/Users/foo/Lisp/**/*.lisp")
Przede powinna zwrócić listę wszystkich plików „LISP” w „/ Users/foo/Lisp /” i wszystko jego podkatalogów
Aby przywrócić .c plików w jednym katalogu użytku.
(directory "/Users/foo/c/src/*.c")
pamiętać, że TRAGICZNA CTORY zwraca listę obiektów ścieżki (nie jest listą ciągów znaków).
? (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")
Powyżej używa obiektu ścieżki, który został utworzony przez MAKE-PATHNAME. Zwraca wszystkie pliki pasujące do /Lisp/cl-http/cl-http-342/server/md5.*.
To jest taka sama, jak:
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
która jest krótsza, ale zależy od składni nazw plików Unix.
Tak pracował dla mnie - (katalog "ścieżka") powrócił zerowa, gdzie (katalog "pathname /*.*") dało mi oczekiwane rezultaty. – Justicle
Potrzebujesz tylko plików z nazwami zawierającymi kropkę? – Svante
Dziwne, huh? Właściwie to po plikach .h i .cpp, ale "pathname/*" zwraca NIL. – Justicle