Есть ли в схеме процедура "перечислить все файлы"? - PullRequest
2 голосов
/ 09 июля 2020

Существует ли процедура racket / scheme, которая возвращает список (или вектор) имен всех доступных пользователю файлов? Вывод должен быть списком или вектором для применения «фильтра», например:

(filter pred list-of-all-files)

Предполагаемое приложение представляет собой текстовую, удобную для пользователя «библиотечную» программу. .

1 Ответ

3 голосов
/ 13 июля 2020

Соответствующие процедуры, которые вы ищете: список-каталогов и в-каталоге .

Используя directory-list, вы можете получить список всех файлов и каталоги в каталоге, заданном некоторым путем (аналогично команде оболочки ls).

;; ls /some/path
(directory-list "/some/path")

С другой стороны, in-directory возвращает последовательность, которая производит все из пути для файлов, каталогов и ссылок внутри каталога, рекурсивно проходящие по вложенным подкаталогам (что, кажется, именно то, что вы в первую очередь ищете).

Например, чтобы вернуть имена всех файлов и каталогов, доступных для чтения пользователем под "/some/path" вы можете:

(for/list ([f (in-directory "/some/path"
                            (lambda (p)
                              (member 'read (file-or-directory-permissions p))))])
  f)

Вместо этого вы можете использовать path-> string для создания имен файлов в строковом формате. Итак, чтобы создать процедуру list-all-files:

(define (list-all-files path)
  (define (user-readable? f)
    (member 'read (file-or-directory-permissions f)))
  (for/list ([f (in-directory path user-readable?)])
    (path->string f)))

Затем вы можете filter сгенерировать список, используя любой предикат pred:

(filter pred (list-all-files "/some/path"))
...