AppleScript复制后正在使用的文件

时间:2014-01-16 19:54:41

标签: applescript

我有一个每两个小时运行一次的脚本。它将Helix数据库集合及其日志文件复制到本地备份文件夹。我先保存,所以它们是同步的,然后将它们复制。它已经开始间歇性地失败,说日志文件正在使用中。它在Finder中变暗了。

这是脚本:

tell application "Finder"
    set dupArray to {}
    --move the collection into the array
    set CollectionName to name of collectionFile
    copy collectionFile to the end of dupArray

    --move the logfile into the array
    set theCollectionLogfile to ((mainLoc as text) & "Log_" & CollectionName & ".hlog")
    if (exists file theCollectionLogfile) then
        copy theCollectionLogfile to the end of dupArray
    end if

    --do the duplicate
    duplicate dupArray to backupFolder with replacing
end tell

如何在第二次更换时复制它?

由于

莱尼

2 个答案:

答案 0 :(得分:0)

注意: 我建议您保存工作并进行有力测试,以便获得这些概念。 请完整阅读。

[编辑:我意识到,即使你可能理解我的意思,当我打算在评论中写“复制”时,我写了“副本”]

您可以尝试使用以下内容:

--right before duplicate
set UNIQUE_fileName to "Log_" & CollectionName & ".hlog"
repeat until fileNotInUse
    try
        do shell script "lsof | grep " & UNIQUE_fileName
    on error
        set fileNotInUse to true
        exit repeat
    end try
end repeat
--do duplicate

这应该等到文件写完之后。您会注意到我正在使用UNIQUE,因为如果系统使用的任何其他文件与该名称相匹配,或者其他什么,它将使您处于无限循环中。避免这种情况的一种方法是传递文件的POSIX样式完整路径而不仅仅是名称。您还可以通过为重复设置上限来格外小心。这是一个使用这两个想法的版本:

--right before duplicate

set upperLimit to 200000
set u to 0

set theCollectionLogfilePOSIX to quoted form of (POSIX path of theCollectionLogfile)
repeat until fileNotInUse
    try
        do shell script "lsof | grep " & theCollectionLogfilePOSIX
    on error
        set fileNotInUse to true
        exit repeat
    end try
set u to (u + 1)
if (u > upperLimit) then exit repeat
end repeat
--do duplicate

再次:

我建议您保存工作并进行有力测试,以便了解概念。

[编辑:它在一个try块中,因为如果没有'open'(也就是说,没有任何东西被lsof结果'grepped'),那么do shell脚本会出错]

答案 1 :(得分:0)

好吧,我终于咬了一口子,然后用'do shell script'写了一下。事实证明Finder不想丢掉文件,它仍然迷上了什么。我使用ditto进行复制(因为文件有资源分叉),我使用rm删除文件。

我认为Finder搞砸了并锁定了一些东西,因为我正在复制的文件在我这样做的时候打开了套接字。我还认为Get Ifo对话框应该有一个区域,您可以看到哪个应用程序正在使用某些内容,如果它处于“正在使用中”。

感谢您的帮助...

莱尼