Я должен получить все (видимое) содержание папки и ее подпапок как список. Действительно ли это возможно?
Я уверен, что есть команда 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, и полное отсутствие ошибок, использующих это (даже во время этого письма), никогда не вызывающую необходимость для меня, чтобы сообщить Отказ
Rightabout является справедливой игрой, и мои извинения за злобный недостаток в MMCGRAIL, и я заменяю его с помощью UPVOTE. Просто чтобы быть понятным, я никогда не думал, что ответ, данный MMCGrail был неправ. Это отличный одноранговый метод удобства, но я остался подальше от моих комментариев, уже данных. Но скорее, это было его голосование и его заявил контекст, с которым я обидел. В конце концов, это просто код, и я думаю, что мы все здесь по той же причине: найти лучший способ сделать то, что мы делаем. Кажется, у меня теперь есть несколько обновлений, чтобы вписать.
ура
это гораздо больше работы, чем нужно. Я знаю, что это старое сообщение, но я хочу, чтобы вы оба увидели, как просто это может быть
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). Это нормально для небольших вещей, например, извлечения всех файлов одного типа из папки, о которой вы известно, что в ней будет только небольшое количество файлов.
Рекурсивный метод также работает хорошо - но он использует "list folder", и в словаре для него сказано, что он устарел, и мы не должны использовать его больше."
Так что я слышу заявление, что я был неправ! Оба эти решения действительны, но имеют "язвы" или дыры в их использовании. Мои аплодисменты Филипу. Если он решит отредактировать свой ответ (потому что это единственный способ изменить мой голос), я буду рад вернуться и дать ему +1
.