10

我需要将文件夹及其子文件夹的全部(可见)内容作为列表获取。这可能吗?

4

3 回答 3

12

这比需要的工作多得多。我知道这是一篇旧帖子,但我希望你们都看看这有多容易

  tell application "Finder"
     set file_list to entire contents of (choose folder with prompt "Please select directory.")
   end tell 

如果你想要一个文件名列表,那么你可以这样做

  tell application "Finder"
    set file_list to name of every file of entire contents of (choose folder with prompt "Please select directory.")
   end tell

由于这篇文章后面的评论,我请一群商业专家来看看这个问题并以公正的方式评估我们的答案,我得到的答案是

“你们两个房子都长痘怎么样?:-)

是的,整个内容完全按照您所说的进行 - 但它很容易在大型文件夹中窒息,并且需要永远(如果您使用的是 10.6,则需要一天)。对于小事情来说没关系,例如从您知道仅包含少量文件的文件夹中提取一种类型的所有文件。

递归方法也很有效——但它使用的是“列表文件夹”,它的字典列表说它已被弃用,我们不应该再使用它了。”

所以我听到宣布我错了!这两种解决方案都是有效的,但在它们的使用中存在“痘”或漏洞。我向菲利普表示赞同。如果他决定编辑他的答案(因为这是改变我投票的唯一方法)我很乐意回来并给他+1

于 2010-03-31T18:11:17.973 回答
8

我确信有一个 shell 命令可以更快地执行此操作,但这是纯 Applescript 中的一种方法,可让您完全控制您希望显示的信息的格式。

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

on createList(item_list)
    set the the_items to list folder item_list without invisibles
    set item_list to item_list as string
    repeat with i from 1 to number of items in the the_items
        set the_item to item i of the the_items
        set the_item to (item_list & the_item) as alias
        set this_info to info for the_item
        set file_name to name of this_info
        set end of kFileList to file_name
        if folder of this_info is true then
            my createList(the_item)
        end if
    end repeat
end createList

附带说明一下,还有一些文件列出的应用程序可以比 Applescript 更快地做到这一点。

更新:作为讨论的结果,这里又是函数,但这次使用更新的 API。这可能需要一些清理工作,但它可以轻松地对我的桌面进行编目(这对我来说是一个很深很深的文件夹):

property kFileList : {}

tell application "Finder"
    set source_folder to choose folder with prompt "Please select directory."
    my createList(source_folder)
end tell

return kFileList

on createList(mSource_folder)
    set item_list to ""

    tell application "System Events"
        set item_list to get the name of every disk item of mSource_folder
    end tell

    set item_count to (get count of items in item_list)

    repeat with i from 1 to item_count
        set the_properties to ""

        set the_item to item i of the item_list
        set the_item to ((mSource_folder & the_item) as string) as alias

        tell application "System Events"
            set file_info to get info for the_item
        end tell

        if visible of file_info is true then
            set file_name to displayed name of file_info
            set end of kFileList to file_name
            if folder of file_info is true then
                my createList(the_item)
            end if
        end if

    end repeat
end createList

我一定是订阅了错误的邮件列表或错过了一个,因为这些 API 更改已经生效,而我从未听说过它们。我在几十个项目中使用了我的第一个方法,主要是因为它是 Apple 最初提供的代码,并且使用它完全没有错误(即使在撰写本文时)从未触发我需要更新任何东西.

转机是公平竞争,我为恶意反对 mmcgrail 表示歉意,我将用赞成票取而代之。为了清楚起见,我从没想过mmcgrail给出的答案是错误的。这是一种很棒的单行便捷方法,但根据我已经给出的评论,我已经远离了这种方法。但相反,我生气的是他的反对票及其陈述的背景。最后,它只是代码,我认为我们都在这里是为了同一个原因:找到一种更好的方式来做我们所做的事情。看来我现在有一些我自己的更新要制定。

干杯

于 2010-01-20T14:31:00.003 回答
1

哇,这已经很晚了,但我检查了一下,它确实有效。

tell application "Finder" to set folder_root to (choose folder with prompt "Please select directory.")

set fl to {}
dump_folder(folder_root)

on dump_folder(f)
    global fl
    tell application "System Events" to set end of fl to (get the POSIX path of f)
    tell application "Finder" to set nfl to (the items of the contents of f)
    repeat with nf in nfl
        dump_folder(nf as alias)
    end repeat
end dump_folder

fl
于 2017-12-27T16:07:32.220 回答