AppleScript: Как проверить, является ли что-то каталогом или файлом

Обновление: Решение ниже


Допустим, у вас есть список выбранных элементов из Finder. Скажем, в выборку включены файлы, папки, различные пакеты и даже некоторые приложения.

Теперь предположим, что вам нужны только те элементы, которые (в терминах UNIX) являются каталогами . Т.е. вам нужны только те элементы, которые вы можете cd использовать в терминале.

Вы можете проверить свойство каждого элемента kind и посмотреть, равно ли оно «Папка», но это не работает для пакеты приложений или другие пакеты / пакеты, хотя на самом деле они являются «папками» (каталогами)

. Если элементы являются фактическими файловыми объектами (а не псевдонимами), вы можете проверить свойство каждого элемента class ... за исключением того, что это тоже не всегда работает, поскольку пакеты теперь являются экземплярами «файлов документов», а приложения - экземплярами «файлов приложений».

Еще хуже, если у вас есть только список псевдонимов, а не фактических файловых объектов, поскольку вы можете Не проверяем свойство class ; он всегда будет просто говорить «псевдоним».

Единственные решения, которые я могу придумать, - это либо получить путь POSIX для каждого элемента и посмотреть, есть ли у него косая черта в конце, либо отправить его путь в сценарий написан на другом языке, который может проверить, является ли что-то каталогом или нет.

Обе идеи кажутся мне безумными. Проверка на наличие косой черты в конце является крайне хакерской и хрупкой, а передача всего в другой сценарий - это полный излишество.


Обновление: То, что предлагает Асмус ниже, кажется единственным хорошим решением. , поскольку кажется, что AppleScript не может решить это самостоятельно :

do shell script "file -b " & filePosixPath

Это вернет строку «каталог» для папки, комплектов, приложений, пакетов и т. Д. И т. Д.
Но обратите внимание (!), Что для дисков он возвращает «липкий каталог».

Вот обобщенная функция, которая работает довольно хорошо

on isDirectory(someItem) -- someItem is a file reference
    set filePosixPath to quoted form of (POSIX path of (someItem as alias))
    set fileType to (do shell script "file -b " & filePosixPath)
    if fileType ends with "directory" then return true
    return false
end isDirectory
9
задан David H 30 January 2013 в 08:59
поделиться