Гарантированное создание каталога
Иногда надо создать файл, располагающийся в несуществующем (по крайней мере пока) каталоге. Или просто создать каталог, куда потом копировать файлы.
Важно то, что стандартная функция лиспа 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 |
В принципе, тут все достаточно понятно и прозрачно. Но, как всегда, несколько дополнительных моментов надо озвучить:
- Необходимо проверять тип привода. Пытаться создавать каталоги на незаписываемом DVD бессмысленно
- Код не проверяет права доступа к родительскому каталогу. Как это сделать лиспом - лично я не знаю. Можно, конечно, ввести дополнительную проверку, но как-то не до того.
Я перечислил только то, с чем лично я столкнулся. Возможно, существуют еще какие-то ситуации, когда каталог создать невозможно.
P.S. В Scripting.FileSystemObjectWScript, кстати, есть метод CreateFolder, но, насколько я помню, он тоже может создавать только один уровень вложения...