#directory #common-lisp
#каталог #common-lisp
Вопрос:
Чтобы удалить файл в Common Lisp, я могу сделать:
(delete-file "c:\path\to\file")
Но по какой-то причине я не могу узнать, как удалить каталог. Нет delete-directory
, и когда я передаю путь к каталогу delete-file
, я получаю:
couldn't delete c:pathtofolder: Unknown error
[Condition of type SB-INT:SIMPLE-FILE-ERROR]
Поиск в Google тоже не помог.
Я использую Steel Banks Common Lisp в Windows, установленный с помощью Lispstick.
Ответ №1:
Uiop
поставляется с ASDF 3 и имеет delete-empty-directory
и delete-directory-tree
.
Пожалуйста, используйте этот тип библиотеки-оболочки для удобства переносимости.
Ответ №2:
Google common lisp delete directory
сразу предложил мне cl-fad. Я думаю, это может быть полезно (но я никогда не пробовал)
Комментарии:
1. Да, я видел это, но подумал, что такой огромный язык, как CL, должен иметь возможность удалять каталог без использования сторонней библиотеки 🙂
2. Это не обязательно. Понятия файла и каталога очень зависят от системы, и были еще более зависимыми в то время, когда Common Lisp был стандартизирован. Поэтому семантика выполнения таких действий была оставлена на усмотрение реализаций.
Ответ №3:
Я сам нашел решение. Я просмотрел исходный код cl-fad (упомянутый в других ответах) и увидел, что он в основном использует разные расширения для разных реализаций Common Lisp. Поскольку я использовал Steel Banks Common Lisp, мое решение было:
(sb-ext:delete-directory "c:\path\to\folder\")
Для большинства других реализаций вам в основном нужно поменять sb-ext
местами имя пакета расширения для рассматриваемой реализации.
Комментарии:
1. Не приведет ли это к потере совместимости, которую вы в противном случае получили бы
cl-fad
?2. Таким образом, вместо того, чтобы зависеть от библиотеки переносимости, теперь вы зависите от шага ручной замены для установки вашего программного обеспечения для разных реализаций CL. Это действительно победа?