如何在处理软件正在使用的文件时避免I/O错误32



我有一台科学仪器,里面有一些软件,还有待改进。。。但它是专有的,我不能改变软件的工作方式。所以我试着好好利用它。

这是我的设置:

软件创建一个文本文件来存储数据。对于每一个新的观察(每10秒),它都会将最新的观察附加到文本文件中。我想将文件保存到共享网络驱动器,以便在其他计算机上可以即时访问该文件的最新信息。然而,如果在软件试图写入文件时,笔记本电脑与网络驱动器的连接中断了很短一段时间,软件就会中断,之后的所有观察结果都会丢失到网络空间中。我得到I/O错误103。

因此,我写了一个小批量文件,先将数据本地保存在硬盘上,然后定期复制:

set /p name= File name (without ".txt"):
set source= C:UsersAdminDesktop%name%.txt
set destination= Z:SKQ201701SBirk_dataO2%name%.txt
:loop
copy %source% %destination%
timeout /t 10
goto loop

这是我的问题:

有时我会遇到I/O错误32。据我所知,这是由于多个程序试图同时访问同一个文件。所以我假设,当我的批处理脚本复制文件时,有时软件会尝试将新的观察结果附加到文件中。当这种情况发生时,我会收到错误消息。我读到过文件在访问时被锁定的消息,但也许这个软件在写入时不会锁定文件?我不确定。。。

我该如何避免这种情况发生?到目前为止,我找到的所有答案都假设这两个过程都在用户的控制之下。通常在同一批处理脚本中。但就我而言,我无法控制专有软件。

我使用的是Windows7。有什么想法吗?

@ECHO OFF
SETLOCAL
set /p name= File name (without ".txt"):
set source= C:UsersAdminDesktop%name%.txt
set destination= Z:SKQ201701SBirk_dataO2%name%.txt
:loop
FOR %%a IN (%source%) DO SET fsize=%%~za
:: wait until size of actual file increases
:monitor
timeout /t 1
FOR %%a IN (%source%) DO IF %fsize% geq %%~za GOTO monitor
:: a little time to stabilise
timeout /t 1
copy %source% %destination%
goto loop

由于关键点是当软件附加到文件时,文件大小会增加,所以只需等待文件大小增加,然后再进行复制,因为下一次增加要10秒…

最新更新