2010-01-19 3 views

ответ

7

Я уверен, что есть команда оболочки, которая может сделать это быстрее, но вот один из способов в чистом 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, и полное отсутствие ошибок с использованием этого (даже на момент написания) никогда не вызывало необходимости обновлять что-либо ,

Turnabout - честная игра, и мои извинения за злобный downvote для mmcgrail, и я заменяю его на upvote. Чтобы быть ясным, я никогда не думал, что ответ, данный mmcgrail, был неправильным. Это отличный однострочный метод, но я остался в стороне от моих уже высказанных комментариев. Но, скорее, это был его голос и его заявленный контекст, с которым я обиделся. В конце концов, это всего лишь код, и я думаю, что мы все здесь по той же причине: найти лучший способ делать то, что делаем. Кажется, у меня теперь есть своя версия, чтобы ее принять.

Cheers

+0

смотрите мой пост – mcgrailm

+0

я сделал правку на мой пост – mcgrailm

+0

он пишет что-то вроде «не может получить каждый диск элемент ...» – user2159978

10

Это больше, чем нужно. Я знаю, что это старый пост, но я хочу, чтобы вы оба видеть, как легко это может быть

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

+0

права, поскольку массивный список {файла документа «FileName» папки «SubFolder» в папке «Папка» папки «имя пользователя» папки «Пользователи» загрузочного диска приложения «Finder», ad nauseum} и необходимости впоследствии обрабатывать *, что * гораздо полезнее, чем требовать голосовать за мою. –

+0

Что нужно для обработки, у вас есть список и ваша ссылка на элементы по мере необходимости, т. Е. Псевдоним элемента в списке файлов, что вы делаете больше работы, чем нужно, поэтому я дал вам проголосовать за то, что я не отдал его вам из несмотря на то, что, как кажется, это то, что вы делаете – mcgrailm

+0

, также ваш kFileList возвращает список имен файлов и не ссылается на то, откуда появился этот файл, и что затем вернуться через папку, чтобы выяснить, откуда они пришли? – mcgrailm

0

Ничего себе это довольно поздно, но я проверил, и он работает.

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 
Смежные вопросы