Как обнаружить файлы (даже в подпапках) с определенным расширением и открыть их? - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь сделать приложение-капельку applscript. Это должно сделать:

  • когда папка отбрасывается, она должна "сканировать" папку, ее подпапки и файлы
  • каждый файл с определенным расширением (например, .txt "должен быть открыт в программе, и что-то должно быть сделано
  • вот и все

Я получаю эту ошибку, когда обнаружил нужный файл и пытаюсь открыть его (приложение не запустится - до этого я получаю эту ошибку и сценарий отменяется): class nmxt of alias "the path to the file" could not be read В настоящее время мой сценарий:

on open {input}
    set theFiles to (getFilesRecursively(input, "plhs"))
    repeat with oneFile in theFiles
        if name extension of oneFile is "plhs" then
            tell application "Applic"
                open oneFile
                activate
                tell application "System Events"
                    tell process "Applic"
                        click menu item "Save" of menu 1 of menu bar item "File" of menu bar 1
                    end tell
                end tell
            end tell
        end if
    end repeat
end open


on getFilesRecursively(fContainer, fExt)
    tell application "Finder"
        set recursiveFileList to entire contents of fContainer as alias list

        set resultFileList to {}
        repeat with aFile in recursiveFileList
            if name extension of aFile contains fExt then
                set resultFileList to resultFileList & aFile
            end if
        end repeat
    end tell
    return resultFileList
end getFilesRecursively

1 Ответ

0 голосов
/ 12 июля 2011

Вот зародышевый скрипт, который должен помочь вам:

property kTargetFileExtension : "txt"
property pValidFileList : {}

on open of theFiles -- Executed when files or folders are dropped on the script

    set fileCount to (get count of items in theFiles)

    repeat with thisFile from 1 to fileCount
        set theFile to item thisFile of theFiles

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

        if visible of file_info is true then -- check for the file extension here as well
            if folder of file_info is true then
                my createList(theFile)
            else
                set fileName to name of file_info
                set targetFileFound to isTargetFile(fileName, kTargetFileExtension) of me

                if (targetFileFound) then
                    set end of pValidFileList to theFile
                end if
            end if
        end if

    end repeat

    display dialog "pValidFileList = " & pValidFileList
    (* do something with your files listed in pValidFileList here *)
end open

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 as alias)
    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 fileName to the_item
        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 -- check for the file extension here as well
            if folder of file_info is true then
                my createList(the_item)
            else
                set targetFileFound to isTargetFile(fileName, kTargetFileExtension) of me

                if (targetFileFound) then
                    set end of pValidFileList to the_item
                end if
            end if
        end if

    end repeat
end createList

on isTargetFile(theFilename, theTargetExtension) -- (string, string) as boolean
    set AppleScript's text item delimiters to "."
    set fileNameList to every text item of theFilename
    set AppleScript's text item delimiters to ""

    try
        set theFileExtension to item 2 of fileNameList as string
    on error
        return false
    end try

    if theFileExtension is theTargetExtension then
        return true
    end if

    return false
end isTargetFile

Несколько вещей, на которые стоит обратить внимание:

Системные события - текущая лучшая практика для получениясписки и информация о файлах.Просто запросить все содержимое быстрее, но известно, что это ненадежно.Этот метод обхода вручную медленнее, но нет сомнений, что вы получите нужные вам файлы.

isTargetFile на самом деле просто работает с именем файла в виде строки, а не полагается на то, что система выдастИнформация.Шесть из одного, полдюжины из другого, если вы спросите меня, но это уменьшает количество вызовов в систему, поэтому я думаю, что это делает это немного быстрее.

Я также склонен добавлять on run {} блокировать эти вещи, чтобы разрешить ручной выбор папки.Это также облегчает тестирование.

Как использовать:

Сохраните сценарий как приложение, и вы получите каплю (значок приложения Applescript со стрелкой, указывающейвниз).

on open of theFiles является эквивалентом main().Вы можете поместить любую комбинацию файлов и папок на каплю, и она справится с остальными.Он заканчивается списком целевых файлов, которые затем можно просмотреть для обработки.Я оставлю это в качестве упражнения для добавления этого бита.

Чтобы настроить цель, измените строку в первой строке, property kTargetFileExtension : "txt", на любое расширение, которое вы ищете.Это также может быть изменено на массив - например, property kTargetFileExtension : {"txt", "rtf", "doc}, но вам также потребуется обновить isTargetFile(theFilename, theTargetExtension), чтобы также просмотреть их.

Кроме того, это просто работает.Прямо сейчас он соберет список txt файлов для обработки.

Добавьте соль по вкусу.

...