AppleScript:"file is already open" 但 "file wasn't open"

AppleScript: "file is already open" but "file wasn't open"

由于我有点强迫症的性格,我的大部分工作时间都花在了一个小问题上。

我最近从 Mac OS X Tiger 切换到 Yosemite(是的,这是一个相当大的飞跃)。我不认为 AppleScript 有那么大的变化,但我遇到了一个我不记得在过去遇到过的问题。我有以下代码,但具有有效的文件路径:

    set my_filepath to (* replace with string of POSIX filepath, because typing
                          colons was too much work *)
    set my_file to open for access POSIX file my_filepath with write permission

其余代码有一个错误,我很容易解决,但因为错误在 close access 命令之前停止了脚本,当然 AppleScript 使文件引用保持打开状态。所以当我再次尝试 运行 脚本时,我被告知语法错误:文件已经打开。这是意料之中的事情。

我 运行 在尝试关闭引用时遇到问题:无论我做什么,我都收到一条错误消息,指出文件 没有 打开。我尝试了 close access POSIX file (* filepath string again *)close access file (* whatever that AppleScript filepath format is called *) 等。最终我通过重新启动计算机解决了问题,但这并不是一个完美的解决方案。如果没有其他解决方案,那就这样吧;然而,出于知识和实际原因,我不满意重启以关闭访问。有人对这个问题有见解吗?

我怀疑我忽略了一些显而易见的事情。


编辑:等等,不,我的转换不是直接来自 Tiger;我在 Snow Leopard 有过一个中级阶段,但那时我并没有写太多脚本。我不知道这是否相关。

同意重启可能是最简单的解决方案。另一个想法是使用 unix 实用程序 "lsof" 来获取所有打开文件的列表。它 returns 是一个相当大的列表,因此您可以将其与 "grep" 结合起来为您过滤。所以下次从终端尝试这个,看看你是否得到结果......

lsof +fg | grep -i 'filename'

如果您得到一个结果,您将得到一个进程 ID (PID),并且您可能 kill/quit 保持文件打开的进程,从而关闭文件。我从未在这种情况下尝试过,但它可能会起作用。

您是否遇到过垃圾箱因为文件已打开而拒绝清空的情况?那是我使用这种方法的时候,它大部分时间都有效。我实际上制作了一个名为 What's Keeping Me (found here) 的应用程序来帮助人们解决这个问题,它使用此代码作为应用程序的基础。也许它也适用于这种情况。

祝你好运。

另一种方法(也是我通常做的)是您还可以注释掉 open for access 行并添加 close access my_file 来修复它。

当我遇到这个问题时,通常退出脚本编辑器并重新打开它就足够了;完全重启机器可能是过度的。如果您 运行 从脚本菜单而不是脚本编辑器中进行此操作,您可以尝试关闭脚本菜单(从脚本编辑器)并再次打开它。关键是文件由进程持有,如果您退出进程,它应该释放任何挥之不去的文件指针。

当我使用 open for access 时,我养成了使用 try 块来捕获文件错误的习惯。例如:

set filepath to "/some/posix/path"

try
    set fp to open for access filepath
on error errstr number errnom
    try
        close access filepath
        set fp to open for access filepath
    on error errstr number errnom
        display dialog errnum & ": " & errstr
    end try
end try

这将尝试打开文件,如果遇到错误则尝试关闭并重新打开,如果遇到更多问题则报告错误。