由于我的性格略显痴迷,我的大部分工作时间都失去了一个小问题。
我最近从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有一个中间阶段,但那时我没有做太多的脚本。我不知道这是否相关。
答案 0 :(得分:1)
遇到此问题后,通常只需退出脚本编辑器并重新打开它即可;完全重新启动计算机可能会过多。如果您是从脚本菜单而不是脚本编辑器运行的,则可以尝试关闭脚本菜单(从脚本编辑器),然后再次打开。关键是文件是由进程保存的,如果您退出该进程,它应该释放所有挥之不去的文件指针。
当我使用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
这将尝试打开文件,尝试将其关闭并在遇到错误时重新打开,并在遇到更多问题时报告错误。
答案 1 :(得分:0)
同意重启可能是最简单的解决方案。另一个想法是unix实用程序" lsof"获取所有打开文件的列表。它会返回一个相当大的列表,因此您可以将其与" grep"为你过滤它。所以下次从终端试一试,看看你是否得到了结果......
lsof +fg | grep -i 'filename'
如果您得到一个结果,您将获得一个进程ID(PID),您可能会杀死/退出保持文件打开的进程,从而关闭该文件。我从来没有尝试过这种情况,但它可能有用。
你有没有垃圾桶拒绝空,因为它说文件是打开的?这是我使用这种方法的时候,大部分时间都可以使用。我实际上创建了一个名为What the#keeps Weeping Me(found here)的应用程序来帮助解决这个问题的人,它使用此代码作为应用程序的基础。也许它也适用于这种情况。
祝你好运。答案 2 :(得分:0)
一种替代方法(也是我通常所做的)是,您也可以注释掉开放访问线路,而只需添加close access my_file
即可对其进行修复。