2013-02-22 26 views
59

Sto utilizzando un'applicazione Windows Form per monitorare una directory e spostare i file contenuti in essa in un'altra directory.Utilizzo di FileSystemWatcher per monitorare una directory

Al momento copierà il file in un'altra directory, ma quando viene aggiunto un altro file terminerà senza alcun messaggio di errore. A volte copia due file prima di terminare con il terzo.

È perché sto utilizzando un'applicazione Windows Form anziché un'app console? C'è un modo per interrompere il programma e continuare a guardare la directory?

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
         | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    //Copies file to another directory. 
} 

risposta

85

Il problema erano i filtri di notifica. Il programma stava tentando di aprire un file che stava ancora copiando. Ho rimosso tutti i filtri di notifica tranne LastWrite.

private void watch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = path; 
    watcher.NotifyFilter = NotifyFilters.LastWrite; 
    watcher.Filter = "*.*"; 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.EnableRaisingEvents = true; 
} 
20

Lei non hanno fornito il codice di gestione dei file, ma suppongo che hai fatto lo stesso errore ognuno fa quando il primo a scrivere una cosa del genere: l'evento filewatcher sarà sollevato non appena viene creato il file. Tuttavia, ci vorrà del tempo per il completamento del file. Ad esempio, prendi una dimensione del file di 1 GB. Il file può essere creato da un altro programma (Explorer.exe lo copia da qualche parte) ma ci vorranno alcuni minuti per completare il processo. L'evento viene generato al momento della creazione e devi attendere che il file sia pronto per essere copiato.

È possibile attendere che un file sia pronto utilizzando la funzione this in un ciclo.

14

Il motivo potrebbe essere che l'osservatore è dichiarato come variabile locale a un metodo e viene raccolto automaticamente al termine del metodo. Dovresti dichiararlo come un membro della classe. Prova il seguente:

+9

La variabile di 'watcher' viene tenuta in vita (non raccolta dati inutili) perché si è iscritto all'evento Changed. – adospace

Problemi correlati