Гарантированное создание каталога

Иногда надо создать файл, располагающийся в несуществующем (по крайней мере пока) каталоге. Или просто создать каталог, куда потом копировать файлы.

Важно то, что стандартная функция лиспа vl-mkdir позволяет создавать только один уровень каталога.

То есть, если существует каталог d:\files, то (vl-mkdir "d:\\files\\my files\\test") не сработает, а вот (vl-mkdir "d:\\files\\my files") выполнит чего от нее требуется и вернет корректное значение.

Поскольку штатные команды могут создавать только один уровень, а привлекать Scripting.FileSystemObject не хочется, попробуем работать через рекурсию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun _lispru-dir-create (path)
                         ;|
*    Гарантированное создание каталога.
*    Параметры вызова:
  path  создаваемый каталог
|;

  (cond
    ((vl-file-directory-p path) path)
    (t
     (vl-mkdir
       (strcat (_lispru-dir-create (vl-filename-directory path))
               "\"
               (vl-filename-base path)
               (cond ((vl-filename-extension path))
                     (t "
")
                     ) ;_ end of cond
               ) ;_ end of strcat
       ) ;_ end of vl-mkdir
     (if (vl-file-directory-p path)
       path
       ) ;_ end of if
     )
    ) ;_ end of cond
  ) ;_ end of defun

В принципе, тут все достаточно понятно и прозрачно. Но, как всегда, несколько дополнительных моментов надо озвучить:

  1. Необходимо проверять тип привода. Пытаться создавать каталоги на незаписываемом DVD бессмысленно
  2. Код не проверяет права доступа к родительскому каталогу. Как это сделать лиспом - лично я не знаю. Можно, конечно, ввести дополнительную проверку, но как-то не до того.

Я перечислил только то, с чем лично я столкнулся. Возможно, существуют еще какие-то ситуации, когда каталог создать невозможно.

P.S. В Scripting.FileSystemObjectWScript, кстати, есть метод CreateFolder, но, насколько я помню, он тоже может создавать только один уровень вложения...

Размещено в Код LISP, Функции LISP · Метки: , ,



Поделитесь своим мнением


Я не робот.