AppleScript:如何检查某些内容是目录还是文件

时间:2011-07-29 10:51:26

标签: applescript

更新:以下解决方案


假设您有Finder中所选项目的列表。假设选择中包含一些文件,文件夹,各种捆绑包甚至一些应用程序。

现在说你只想要那些(在UNIX术语中)目录的项目。即您只需要在终端中cd可以使用的项目。

您可以检查每个项目的kind属性,看它是否等于“文件夹”,但这对应用程序包或其他包/包不起作用,尽管它们实际上是“文件夹”(目录)< / p>

如果项目是实际的文件对象(不是别名),您可以检查每个项目的class属性...除了并不总是有效,因为捆绑包现在是“文档文件”实例和应用程序是“应用程序文件”实例。

如果您只有一个别名列表而不是实际文件对象,那就更糟了,因为您无法检查class属性;它总是只会说“别名”。

我能想到的唯一解决方案是获取每个项目的POSIX路径,看看它是否有正斜杠,或者将其路径发送到用不同语言编写的脚本,这可以检查是否什么是目录或不是。

这两个想法对我来说都很疯狂。检查尾随斜杠是非常hacky和脆弱的,并将所有内容提供给不同的脚本是完全矫枉过正的。


更新:Asmus建议下面的确是唯一的一个很好的解决方案,因为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

4 个答案:

答案 0 :(得分:6)

有一个简单的AppleScript解决方案。您可以使用系统事件检查某些内容是否为“包”。

tell application "Finder" to set theItems to (selection) as alias list

set canCDItems to {}
tell application "System Events"
    repeat with anItem in theItems
        if anItem is package folder or kind of anItem is "Folder" or kind of anItem is "Volume" then
            set end of canCDItems to contents of anItem
        end if
    end repeat
end tell
return canCDItems

答案 1 :(得分:1)

如果变量只是一个字符串,请使用以下格式:

on isDirectory(someItem) -- someItem is a string
    set filePosixPath to quoted form of (POSIX path of someItem)
    set fileType to (do shell script "file -b " & filePosixPath)
    if fileType ends with "directory" then return true
    return false
end isDirectory

答案 2 :(得分:0)

我今天需要这个,因为我试图将一些差异工具插入Finder for Mountain Lion,并想检查所选项目是项目还是文件。这对我有用:

tell application "Finder"
  set sel1 to the selection
  set class1 to class of (item 1 of sel1)
  set cs to (class1 as string)
  ...
  if cs = "folder" or cs contains "class cfol" then
    set choice to display alert "Which tool?" buttons {"opendiff", "diffmerge"}
    set tool to (button returned of choice)

我发现我需要为两种情况测试cs,具体取决于我是在AppleScript编辑器中运行还是在Finder上单击工具栏按钮。远非最新但仅比以前的AppleScript解决方案更短,这将是我的替代提案

on isDirectory(someItem)
  ((class of someItem) as string) contains "fol"
end isDirectory

在所有情况下全面测试的结果欢迎!

答案 3 :(得分:0)

Standard Additions提供此功能(无需系统事件):

set isBundleType to package folder of (info for (choose file))