【问题标题】:How to avoid I/O error 32 when handling file being used by software处理软件正在使用的文件时如何避免 I/O 错误 32
【发布时间】: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


【解决方案1】:
@ECHO OFF
SETLOCAL
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
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 秒内到期...

【讨论】:

  • 好主意!谢谢 Magoo!
  • 哦,拍摄。我在这里开枪了。对不起。我仍然收到错误消息。不过你的回答很有道理。为什么还会有错误???
  • 嗯嗯。可能奏效了。显而易见的是,应用程序正试图在批处理/复制操作完成之前重新打开文件。所以 - 也许您可以通过添加序列号来重命名文件,然后将重命名的文件附加到目标文件。这样你最终会得到大量的小文件......也许你可以将文件设置在 ramdrive 上,然后将文件复制到 ramdrive 上的另一个名称,然后 然后 到网络。这应该可以最大限度地减少批次拥有有争议文件的时间。
猜你喜欢
  • 2018-05-20
  • 2011-10-11
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多