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