In molti dei miei apps Ho codice simile al seguente:Delphi: Perché a volte ricevo un errore I/O 103 con questo codice?
if ForceDirectories(ExtractFilePath(lLogName)) then
begin
AssignFile(lLog, lLogName);
try
if FileExists(lLogName) then
Append(lLog)
else
Rewrite(lLog);
Writeln(lLog, lLogLine);
finally
{$I-}CloseFile(lLog);{$I+}
end;
end;
In una sola applicazione, la prima volta che provo a eseguire questo ho sempre ottenere un errore 103 un'eccezione I/O sulla linea con l'accodamento dichiarazione (il file esiste prima di chiamare questo). Tutti i tentativi successivi all'operazione funzioneranno comunque, fino a quando non riavvio l'app.
Tutti i documenti che ho trovato su questo errore finora indicato che questo sarebbe neanche essere causato chiamando CloseFile
senza previa Reset
o Rewrite
(Append
in genere non è menzionato) o se il file era in uso da un altro processo. Poiché l'eccezione si verifica prima della chiamata a CloseFile
, ovviamente non poteva essere la prima.
Ho già provato a inserire uno Reset
subito dopo lo AssignFile
per buona misura, ma poi ottengo l'eccezione su quella linea.
Non c'è anche nessun'altra applicazione che acceda apertamente quel file. Dico "apertamente" perché ho un leggero sospetto che l'anti-virus (TrendMicro nel mio caso) potrebbe essere il cuplrit qui (quindi forse il file è in uso). Se quello fosse davvero il problema, quale sarebbe il modo migliore per aggirarlo? Hard-codifica una richiamata automatica in realtà non sentire come una soluzione pulita per me ...
Un altro caso in cui a volte ottengo l'errore 103 è questo codice, che io uso per creare un file vuoto (o più spesso per svuotare un file esistente):
AssignFile(lFile, AFileName);
try
Rewrite(lFile);
finally
CloseFile(lFile);
end;
In questo caso è molto più difficile da riprodurre. Succede molto meno spesso. Il più delle volte questo sembra accadere alla prima esecuzione dopo aver ricompilato l'applicazione. Potrebbe questo essere di nuovo l'anti-virus che si frappone? Ho sempre visto questo accadere sulla mia macchina di sviluppo e non ho mai ottenuto un rapporto da un cliente. Come nel caso del primo scenario, ciò si verifica solo una volta per sessione applicativa (se non del tutto). I tentativi successivi sono sempre positivi.
Qualche suggerimento per un approccio diverso, potenzialmente più sicuro per la creazione di file vuoti o lo svuotamento di quelli esistenti?
+1 Sostengo fortemente l'uso di TFileStream. Una volta effettuato l'interruttore, non vorrai tornare indietro. – skamradt
Sì, usando TFileStream sarete in grado di lavorare con file più grandi di 2 GB. Su tali file 'append()' e 'writeln()' non possono funzionare ('IOResult <> 0' o eccezione). –