windows - Sådan undgår jeg/O-fejl 32, når du håndterer fil, der bruges af software

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et videnskabeligt instrument med noget software, der efterlader noget at ønske ... men det er proprietært og jeg kan ikke gøre noget ved at ændre, hvordan softwaren virker. Så jeg forsøger at lege godt med det.


Her er min opsætning:


Softwaren opretter en tekstfil for at gemme dataene. Med hver ny observation (hvert 10. sekund) tilføjer det den seneste observation til tekstfilen. Jeg vil gemme filen til et delt netværksdrev, så jeg kan få øjeblikkelig aktuel adgang til filen på min anden computer. Men hvis den bærbare computer mister forbindelsen til netværksdrevet selv for en lille smule tid, mens softwaren forsøger at skrive til filen, bryder programmet og alle observationer efter det går tabt i cyberspace. Jeg får I/O-fejl 103.


Så her er en lille batchfil, jeg har skrevet op for at gemme dataene lokalt på harddisken først og derefter lave kopier regelmæssigt:


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


Her er mit problem:


Nogle gange får jeg I/O-fejl 32. Fra det jeg har læst skyldes dette, at flere programmer forsøger at få adgang til samme fil på samme tid. Så jeg antager, at sommetider forsøger softwaren at tilføre en ny observation til fil mens mit batch script kopierer filen. Når det sker, får jeg fejlmeddelelsen. Jeg har læst om filer, der er låst, når de er tilgængelige, men måske lader denne software ikke filen, mens du skriver? Jeg er ikke sikker ...


Hvordan kan jeg undgå at dette sker? Alle svarene jeg har fundet hidtil antager, at begge processerne er under brugerens kontrol. Typisk i samme batch script. Men i mit tilfælde kan jeg ikke kontrollere den proprietære software.


Jeg er på Windows 7. Eventuelle ideer?

Bedste reference


@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


Da det kritiske punkt er, når softwaren tilføjer filen, så filsize vil stige, så vente blot på en filstørrelsesforhøjelse og lav kopien, da den næste stigning ikke skyldes i 10 sekunder ...