【问题标题】:AppleScript: "file is already open" but "file wasn't open"AppleScript:“文件已打开”但“文件未打开”
【发布时间】:2015-04-01 21:41:00
【问题描述】:

由于我有点强迫症的性格,我把大部分的生产时间都浪费在了一个小问题上。

我最近从 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 中有一个中级阶段,但那时我并没有做太多的脚本编写工作。我不知道这是否相关。

【问题讨论】:

  • 重新启动脚本编辑器的替代方法是购买脚本调试器,我相信它可以让您在发出警告后关闭“泄露”的文件处理程序。我的 4.5 版(过时)至少可以做到这一点。

标签: file applescript


【解决方案1】:

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

lsof +fg | grep -i 'filename'

如果你得到一个结果,你将得到一个进程 ID (PID),你可能会杀死/退出保持文件打开的进程,从而关闭文件。我从未尝试过这种情况,但它可能会起作用。

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

祝你好运。

【讨论】:

  • 如果这回答了您的问题,请通过检查将其标记为答案。这可以让其他人知道您得到了帮助。
  • 我不敢相信我花了多长时间寻找那个复选标记。
【解决方案2】:

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

当我使用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

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

【讨论】:

    【解决方案3】:

    另一种选择(也是我通常做的)是您也可以注释掉 open for access 行,然后添加 close access my_file 来修复它。

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      相关资源
      最近更新 更多