Si è verificato un problema con FileSystemWatcher quando più file vengono inseriti nella directory controllata. Voglio analizzare il file non appena viene inserito nella directory. In genere, il primo file analizza correttamente, ma l'aggiunta di un secondo file alla directory provoca un problema di accesso. Occasionalmente, il primo file non viene nemmeno analizzato. C'è solo un'applicazione in esecuzione e guardando questa directory. Alla fine, questo processo verrà eseguito su più macchine e guarderanno una directory condivisa, ma solo un server può analizzare ogni file mentre i dati vengono importati in un database e non ci sono chiavi primarie.Errore di accesso ai file con FileSystemWatcher quando più file vengono aggiunti a una directory
ecco il codice FileSystemWatcher:
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
Poi il metodo che analizza il file:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
Quando si sposta il secondo file, si sta recuperando
System.IO .IOException: il processo non può accedere al file 'C: \ Temp \ TestFile.txt' perché è utilizzato da un altro processo.
Mi piacerebbe vedere questo errore se era in esecuzione su più macchine, ma per ora funziona solo su un server. Non ci dovrebbe essere un altro processo che utilizza questo file: li ho creati e li copio nella directory quando l'applicazione è in esecuzione.
È questo il modo corretto di configurare FileSystemWatcher? Come posso vedere che cosa ha il blocco su questo file? Perché non analizza entrambi i file? Devo chiudere FileStream? Voglio mantenere l'opzione FileShare.None perché voglio solo che un server analizzi il file - il server che ottiene il file lo analizza per primo.
Questi file di test sono piccoli - solo poche righe di testo breve, quindi non dovrebbe essere bloccato per troppo tempo durante la copia. Come posso eseguire il ciclo per verificare se il file è pronto per la scrittura? –
Grazie! Mi vergogno di non riuscire a pensare a un ciclo while come soluzione a questo: avevo bisogno di leggere una versione aggiornata di un file di output di un'altra app. Ho ottenuto più eventi per scrittura, quindi ho utilizzato un timer che viene reimpostato ogni volta e attende X secondi prima di attivare il codice che legge il file aggiornato. Ma poi ho perso gli aggiornamenti se l'app ha scritto due volte entro X secondi. – Gishu
+1 Ma dovresti davvero avere un tempo massimo per aspettare in modo che il processo non sia bloccato per sempre –