5

在我的应用程序中,我喜欢让 OSX Finder 复制文件或文件夹。

注意:我有充分的理由使用 Finder 而不是使用 shell cmds、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 中以交互方式执行此类复制操作时显示,如下所示:

发现者

现在,事情是这样的: 如果我从 3rd 方应用程序 Script Debugger 运行此脚本,则会出现此对话框!

因此,显然有一种方法可以让 Finder 显示对话框而不是抛出异常。但是怎么做?谁知道这其中的秘密?

4

3 回答 3

1

好吧,为了我自己的需要,我找到了一个解决方案:我需要直接使用 AppleEvents API,而不是使用 AppleScript。

在那里,我可以将值kAEAlwaysInteract | kAECanSwitchLayer提供给AESend的 SendMode 参数。这使得对话框出现在 Finder 中(在这种情况下也将 Finder 放在前面)。

但是,对于依赖 AppleScript 的人来说,不幸的是,这不是一个解决方案。

于 2014-07-06T14:13:48.583 回答
0

在使用 AppleScript 时,似乎实际上没有办法让 Finder 显示对话框——至少当脚本在其常规环境中运行时是这样。在我的测试中,当目标已经存在时, FinderSystem Events的文件命令始终会出错——唯一的区别是,除了语义之外,Finder 提供了一个开关来抑制这种行为,这意味着目标文件将被覆盖没有提示,但没有选项将其设置为(有关完全相同问题的讨论,请参阅此 MacScripter 线程)。movereplacingtrueask

如果不深入了解其内部工作原理,我只能冒险猜测Script Debugger以不同方式处理这种情况的事实很可能是因为它没有在正常环境中运行脚本。很难想象它如何在不创建自己的脚本执行层的情况下连接到脚本的内部工作以作为调试器完成其工作。这样的中间层可以解释为什么命令以不同的方式转发到应用程序——在 Finder 和 的情况下move,到将显示对话框的低级 Finder 复制例程。

正如 Paul R 所建议的那样,您可以自己重新实现该功能,或者转向AppleScript-ObjectiveC(恐怕不是我的专业领域)。

于 2012-05-03T18:53:40.620 回答
-1

这可能会迟到,但如果您在复制文件之前删除文件,则与替换相同:

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

并且由于在替换或停止查找器之间没有选择,因此不应出现这样的窗口

于 2014-03-03T23:33:26.800 回答