Некоторые особенности findfile
Всем хороша функция findfile - позволяет найти файл или каталог. Но, понадеявшись на ее корректную работу, я чуть не "обрушил" AutoCAD 2002 на Windows XP Pro x64...
Проблема крылась в том, что findfile не определяет существование каталога. Причем не всегда
Т.е., например
1 | (findfile (getenv "AppData")) |
вернет корректный результат. А вот
1 | (findfile "c:\\Program Files (x86)\\AutoCAD 2002\\Support") |
уже вернет nil, несмотря на тот факт, что и каталог существует, и права на доступ к нему есть.
Пришлось писать "обход"
1 | (setq fso (vlax-get-or-create-object "Scripting.FileSystemObject")) |
и вместо findfile использовать
1 2 3 4 5 6 7 8 9 | (vl-catch-all-error-p (vl-catch-all-apply (function (lambda () (vlax-invoke-method fso 'getfolder x) ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) |
Самое главное - потом не забыть выполнить (vlax-release-object fso).
Конечно, такое решение медленнее стандартного, но всяко лучше чем некорректная работа.