Sto utilizzando FileSystemWatcher per eseguire la scansione di una cartella in cui i file vengono caricati dall'applicazione Web. Ho caricato più di 1000 file nella cartella. Ora, il problema è che FileSystemWatcher è stato avviato quando il primo file è stato copiato, a volte non funziona per tutti i file. Qualsiasi suggerimento sarà altamente apprezzabile.FileSystemWatcher non funziona correttamente
risposta
Il FileSystemWatcher
documentation dice che (sottolineatura mia):
Il sistema operativo Windows segnala il componente di file cambia in un buffer creato dal FileSystemWatcher. Se ci sono molte modifiche in un breve periodo, il buffer può traboccare. Questo fa sì che il componente perda traccia delle modifiche nella directory, e sarà solo fornire notifica coperta. Aumentando la dimensione del buffer con la proprietà InternalBufferSize è costosa, poiché proviene dalla memoria non paginata che non può essere scambiata su disco, quindi mantenere il buffer piccolo ma abbastanza grande da non perdere alcun evento di modifica del file. Per evitare un overflow del buffer, utilizzare le proprietà NotifyFiltro e IncludeSubdirectories in modo da poter escludere le modifiche indesiderate delle notifiche .
.
Nota che un FileSystemWatcher può mancare ad un evento quando la dimensione del buffer viene superata. Per evitare eventi mancanti, attenersi alle seguenti linee guida:
Aumentare la dimensione del buffer impostando la proprietà InternalBufferSize.
Evitare di guardare file con nomi di file lunghi, poiché un nome file lungo contribuisce a riempire il buffer. Si consiglia di rinominare questi file utilizzando nomi più brevi.
Mantieni il codice di gestione degli eventi il più breve possibile.
Se avete provato quanto sopra e non è ancora abbastanza affidabile per voi, I 'm paura che l'unica soluzione sarà quella di sottoscrivere l'evento Error
e manualmente elencare il contenuto della directory ogni volta che si verifica.
di approfondire la risposta di Jon:
C'è un'altra possibile soluzione di rinviare un buffer overflow dall'occuring. Gestendo gli eventi che monitorate, ad esempio l'evento Created, il più rapidamente possibile rimuovete le informazioni legate all'evento dal buffer in modo che possa recuperare questo spazio.
Per accelerare, è possibile scegliere di elaborare i file in modo asincrono. Non appena viene attivato l'evento, si accoda il percorso completo del file in una coda che a sua volta verrà elaborata da un thread di lavoro. Il compito del gestore eventi legato all'evento Created viene ridotto all'aggiunta di una stringa (il percorso del file) a una coda.
Ad esempio:
public class FileProcessor
{
private readonly Queue<string> files = new Queue<string>();
public void EnqueueFile(string path)
{
files.Enqueue(path);
}
}
Il codice per il gestore di eventi collegata all'evento creato può quindi essere ridotto al minimo per questo:
static void file_Created(object sender, FileSystemEventArgs e)
{
_fileProcessor.EnqueueFile(e.FullPath);
}
Potete trovare ulteriori informazioni su questo (codice di esempio incluso) in un post che ho scritto circa due anni fa: