Pliki

Praca z plikami i katalogami jest niezbędna do Scheme. Niezależnie od tego, czy zapisujesz dane wyjściowe, ładujesz zasoby, czy organizujesz strukturę projektu, zrozumienie operacji na plikach sprawi, że Twoje skrypty będą bardziej niezawodne i przyjazne dla użytkownika.

Na tej stronie opisano typowe zadania związane z plikami i katalogami: odczytywanie ścieżek, tworzenie katalogów i zbieranie danych wejściowych z folderów za pomocą parametrów GUI.

Katalog domowy użytkownika

Lumi działa tylko na Linuksie, więc katalog domowy użytkownika pochodzi ze zmiennej środowiskowej HOME.

Aby uzyskać katalog domowy użytkownika jako ciąg znaków:

(getenv "HOME")

Przykładowe wyjście:

"/home/username"

Separator katalogów

Istnieje również zmienna globalna DIR-SEPARATOR, która jest separatorem ścieżki specyficznym dla platformy. W Lumi (Linux) jest to zawsze /.

> DIR-SEPARATOR
"/"

Uzyskiwanie lokalizacji z katalogu

Możemy zapytać użytkownika o lokalizację katalogu w oknie dialogowym Scheme dla wtyczki.

(scheme-register
  "scheme-batch-process"
  "Batch Process"
  "Iteratively open the source files, then process, export and close"
  "Mark Sweeney"
  "Under GNU GENERAL PUBLIC LICENSE Version 3"
  "2025"
  ""
  SF-DIRNAME "Loca_tion of Source"       ""
  SF-DIRNAME "Location of _Destination"  ""
  SF-TOGGLE  "S_how Loaded Images"       0
  SF-TOGGLE  "Only Process Open I_mages" 0)

SF-DIRNAME udostępnia przeglądarkę do katalogu.

(define (batch-process-file-system src-dir src-dir-fallback extension dst-dir dst-dir-fallback show-images process-fn export-fn)
  (let* ((validated-src-dir (validate-path-and-dir src-dir src-dir-fallback "Source"))
         (validated-dst-dir (validate-path-and-dir dst-dir dst-dir-fallback "Destination"))
         (files (discover-files validated-src-dir extension)))
    ;; …
    ))

Tutaj sprawdzamy dwa wejścia katalogu (źródłowy i docelowy) i przywracamy wartości domyślne, jeśli ścieżki GUI są puste/nieprawidłowe.

/hub/scripting/plug-ins/batch-process/

Jeśli interesują Cię szczegóły implementacji, poszukaj w źródle wtyczki validate-path-and-dir.

Tworzenie katalogu

Scheme udostępnia polecenie dir-make umożliwiające utworzenie katalogu. To polecenie przyjmuje ścieżkę oddzieloną znakiem „/” i tworzy pojedynczy katalog z opcjonalnym parametrem dla uprawnień. Nie nadajemy mu ścieżek specyficznych dla platformy.

Zwykle musimy utworzyć wiele katalogów dla praktycznej ścieżki. Możemy użyć opakowania dla dir-make, aby nam w tym pomóc.

;; Cel: Opakowanie dla (dir-make), które tworzy podaną ścieżkę z poziomu platformy
;;          podanej ścieżki. Zawsze emituje separatory w stylu Linux dla dir-make.
(define (make-dir-path path)
  (let* ((path-parts (strbreakup path DIR-SEPARATOR))
         (current-path (car path-parts))) ; Katalog główny
    ;; Utwórz pozostałe katalogi krok po kroku
    (for-each
     (lambda (part)
       (set! current-path (string-append current-path "/" part)) ; Buduje ścieżkę
       (if (file-exists? current-path)
         (debug-message "Directory exists: " current-path)
         (if (dir-make current-path)
           (debug-message "Made directory: " current-path)
           (warning-message "Failed to make directory: " current-path))))
     (cdr path-parts))))

Uwaga: Ta funkcja wykorzystuje również wbudowane file-exists? do pomijania niepotrzebnych połączeń. Zwraca #t, jeśli wskazany plik lub katalog istnieje, i #f, jeśli nie istnieje lub nie jest dostępny dla żądającego użytkownika.

Konstruowanie ścieżki

Musimy także rozbić i odbudować ścieżki w Scheme.

Aby podzielić ścieżkę na części, użyj strbreakup:

Przykłady ścieżek do Linuksa

> (strbreakup (getenv "HOME") DIR-SEPARATOR)
("" "home" "username")

> (strbreakup "/this/path/" DIR-SEPARATOR)
("" "this" "path" "")

Uwaga: Ukośniki początkowe i końcowe stają się pustymi elementami ciągu na wynikowej liście.

Aby odbudować ścieżkę, użyj string-append:

Tworzenie ścieżki do Linuksa

> (string-append (getenv "HOME") DIR-SEPARATOR "myfolder" DIR-SEPARATOR "myfile.xcf")
"/home/username/myfolder/myfile.xcf"