Копирование элементов через Finder и Applescript: как получить "элемент существует - заменить?" диалог в Finder?

В моем приложении мне нравится, когда OSX Finder копирует файл или папку.

(Примечание: у меня есть веские причины для использования Finder вместо использования командных оболочек, NSWorkspace или других средств, поэтому нет необходимости вносить предложения в этом направлении.)

В настоящее время я полагаюсь на Applescript, который просит Finder выполнить операцию копирования. Вот пример сценария для тестирования:

tell application "Finder"
    try
        copy file POSIX file "/etc/bashrc" to folder POSIX file "/private/tmp"
        -- alternative with same behavior:
        --duplicate POSIX file "/etc/bashrc" to POSIX file "/private/tmp"
    on error errmesg number errn
        display dialog "Error thrown: " & errmesg
    end try
end tell

Теперь проблема заключается в следующем: если целевой элемент уже существует, сценарий выдает ошибку и отменяет операцию копирования.

Тем не менее, я бы предпочел, чтобы Finder отображал диалоговое окно "элемент существует", которое отображается при интерактивном выполнении такой операции копирования в Finder, например:

Искатель

Теперь вот что:если я запускаю этот скрипт из стороннего приложения Script Debugger, то появляется это диалоговое окно!

Итак, очевидно, что есть способ заставить Finder отображать диалоговое окно, а не генерировать исключение. Но как? Кто знает секрет этого?

3 ответа

Ну, для собственных нужд я нашел решение: вместо использования AppleScript мне нужно напрямую использовать API AppleEvents.

Там я могу предоставить значения kAEAlwaysInteract | kAECanSwitchLayer в AESendПараметр SendMode. Это заставляет диалоги появляться в Finder (и в этом случае также выводит Finder на передний план).

Однако для тех, кто полагается на AppleScript, это, к сожалению, не решение.

Кажется, что на самом деле нет способа заставить Finder отображать диалоговое окно при использовании AppleScript - по крайней мере, когда скрипт выполняется в обычной среде. В моем тестировании и файл Finder, и системные событияmove Команды последовательно выдают ошибку, когда цель уже присутствует - единственное отличие состоит в том, что помимо семантики, что Finder предлагает replacing переключиться, чтобы подавить это поведение с true это означает, что целевой файл будет перезаписан без запроса, но нет возможности установить это значение ask (см. эту ветку MacScripter для обсуждения того же вопроса) .

Без глубокого знания его внутренней работы, я могу только рискнуть предположением, что Script Debugger обрабатывает это по-другому, скорее всего из-за того, что он не запускает скрипты в обычной среде. Трудно представить, как он мог бы подключиться к внутренней работе скрипта, чтобы выполнять свою работу в качестве отладчика без создания собственного уровня выполнения скрипта. Такой промежуточный уровень может объяснить, почему команды передаются по-разному приложениям - в случае с Finder и move, в низкоуровневую программу поиска Finder, которая покажет диалоговое окно.

Что оставляет вас с возможностью повторной реализации этой функциональности самостоятельно, как полагает Пол Р., или с переходом на AppleScript-ObjectiveC (боюсь, это не моя область знаний) .

Это может быть поздно, но если вы удалите файл, прежде чем скопировать его, то же самое, что заменить:

tell application "System Events"
    if exists file ("NewFilePath") then
        delete file ("NewFilePath")
            -- NewFilePath Is where the file will end up or already is
    end if
end tell
tell application "Finder"
    try
        copy file POSIX file "FilePath" to folder POSIX file "FolderPath"
        -- FilePath is where it is now
        -- FolderPath is the path of the folder you want the file in
    on error errmesg number errn
        display dialog "Error thrown: " & errmesg
    end try
end tell

и так как нет никакого выбора между заменой или остановкой искателя, не должно вызывать такое окно

Другие вопросы по тегам