【发布时间】:2017-01-31 23:45:31
【问题描述】:
我有一个带有一些软件的科学仪器,有些软件有待改进......但它是专有的,我无法改变软件的工作方式。所以我试着和它玩得很好。
这是我的设置:
软件会创建一个文本文件来存储数据。对于每个新的观察结果(每 10 秒),它会将最新的观察结果附加到文本文件中。我想将文件保存到共享网络驱动器,这样我就可以在我的另一台计算机上即时访问最新的文件。但是,如果笔记本电脑在软件尝试写入文件时即使在很短的时间内断开与网络驱动器的连接,软件也会中断,之后的所有观察结果都会丢失到网络空间中。我收到 I/O 错误 103。
所以这是我编写的一个小批处理文件,用于先将数据本地保存在硬盘驱动器上,然后定期进行复制:
set /p name= File name (without ".txt"):
set source= C:\Users\Admin\Desktop\%name%.txt
set destination= Z:\SKQ201701S\Birk_data\O2\%name%.txt
:loop
copy %source% %destination%
timeout /t 10
goto loop
这是我的问题:
有时我会收到 I/O 错误 32。根据我的阅读,这是由于多个程序试图同时访问同一个文件。所以我假设有时软件会在我的批处理脚本复制文件时尝试将新的观察结果附加到文件中。发生这种情况时,我会收到错误消息。我读过文件在被访问时被锁定,但也许这个软件在写入时没有锁定文件?我不确定...
我怎样才能避免这种情况发生?到目前为止,我找到的所有答案都假设这两个过程都在用户的控制之下。通常在同一个批处理脚本中。但就我而言,我无法控制专有软件。
我使用的是 Windows 7。有什么想法吗?
【问题讨论】:
-
这是因为软件在写入时锁定文件,阻止您的批处理文件打开它。有两种解决方案,我怀疑它们都不适合您:1)在复制操作期间停止软件并在之后重新启动,或 2)联系软件供应商并要求他们更改写入文件的方式。
-
我每 10 秒添加一行,文件变得非常大。这可能会排除云自动同步解决方案。一个可接受的替代方案是
tail -n 300文件以获得过去 5 分钟的最新观察结果吗?这将使您可以相当快速地复制摘要数据,而不必每 10 秒复制一个 200 gig 文件。如果复制到网络共享失败,则不太可能影响您的仪器监控软件。 -
可以做到,但也不是小事。密钥是opportunistic locking。您必须编写一个程序来读取文件内容,同时持有机会锁。 (不过,我不确定 cmets 中提到的竞争条件。我认为故障率可能低到可以接受,例如,一百年一次。)
-
... 请注意,我假设它是因错误 32 而失败的专有程序。如果它是您的批处理文件,则无需担心,因为您将反正几秒钟后会再试一次。
标签: windows batch-file windows-7