Некоторые особенности 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).

Конечно, такое решение медленнее стандартного, но всяко лучше чем некорректная работа.

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



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


Я не робот.