2017-01-31 6 views
1

私は科学的な楽器を持っていますが、これは必要なものが残っています...しかし、それは専有的なものであり、働くだから私はそれをうまく演奏しようとしている。ソフトウェアで使用されているファイルを処理する際のI/Oエラー32の回避方法

ソフトウェアは、データを格納するためのテキストファイルを作成します。

は、ここに私のセットアップです。新しい観測(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です。ご意見はありますか?

+0

これは、ソフトウェア**が書き込み中にファイルをロックするために発生し、バッチファイルが開かないためです。 2つの解決法がありますが、いずれも私の場合はどちらもうまくいきません。1)コピー操作中にソフトウェアを停止してから再起動するか、2)ソフトウェアベンダーに連絡して、ファイルへの書き込み方法を変更するよう依頼してください。 –

+0

私は10秒ごとに行を追加すると、ファイルはかなり大きくなります。おそらく、クラウドの自動同期ソリューションは除外されます。受け入れ可能な代替案は、ファイルを['tail -n 300'](http://gnuwin32.sourceforge.net/packages/coreutils.htm)して過去5分間の最新の観測を得ることですか?これにより、10秒ごとに200ギガバイトのファイルをコピーすることなく、合理的に高速な要約データのコピーを作成できます。また、ネット共有へのコピーが失敗した場合、機器監視ソフトウェアに影響を与える可能性は低くなります。 – rojo

+0

できますが、それは自明ではありません。キーは[opportunistic locking](https://blogs.msdn.microsoft.com/oldnewthing/20130415-00/?p=4663)です。便宜的なロックを保持したまま、ファイルの内容を読み取るプログラムを作成する必要があります。 (私は、コメントで言及された競争条件については確信していませんが、100年に1回というように、失敗率は十分に低いと思われます) –

答えて

3
@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 

重要なポイントは、ソフトウェアがファイルに追加する場合、その後、filsizeが増加しますので、次の増加は10のための原因ではないので、単にファイルサイズ-増加を待ってから、コピーを行うことであるので、秒...

+0

素晴らしいアイデア!ありがとうMagoo! – CephBirk

+0

ああシュート。私はここで銃を飛ばした。ごめんなさい。私はまだエラーが発生しています。あなたの答えは理にかなっています。なぜまだエラーがありますか? – CephBirk

+0

ああ。おそらく働いたかもしれない。明白なことは、バッチ/コピー操作が完了する前にアプリケーションがファイルを再オープンしようとしていることです。ですから、シーケンス番号を追加してファイルの名前を変更し、名前を変更したファイルを宛先ファイルに追加することもできます。あなたは非常に多くの小さなファイルをそのように終わらせるでしょう...おそらく、あなたはramdriveでファイルを設定してから、そのファイルをramdrive上の別の名前にコピーしてから、ネットワーク上にコピーすることができます。これにより、バッチが紛争中のファイルを占有する時間が最小限に抑えられます。 – Magoo

関連する問題