我有一个每两个小时运行一次的脚本。它将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
如何在第二次更换时复制它?
由于
莱尼
答案 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对话框应该有一个区域,您可以看到哪个应用程序正在使用某些内容,如果它处于“正在使用中”。
感谢您的帮助...
莱尼