2012-11-23 10 views
6

Ho creato un'applicazione che guarderà una determinata cartella solo per i file appena creati e la elenca nella lista, ora voglio fare ogni volta che rileverà il file l'applicazione lo leggerà e visualizzerà il testo nella casella di riepilogo, ho quasi avuto perché a volte quando rileva 2 o 3,4,5,6 file ecc a volte ok ma a volte anche verrà richiesto l'errore "Il processo non può accedere al file" C: \ Users \ PHWS13 \ Desktop \ 7.request.xml 'perché è utilizzato da un altro processo. ".Il file viene utilizzato da un altro processo con FileSystemWatcher e Task

Come risolvere il problema? Ecco il mio codice:

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     if (!listBox1.Items.Contains(e.FullPath)) 
     { 
      //add path 
      listBox1.Items.Add(e.FullPath + "" + DateTime.Now.ToString()); 
      //get the path 
      path = e.FullPath; 
      //start task 
      startTask(); 
     } 
    } 

    private void startTask() 
    { 
     //start task 
     Task t = Task.Factory.StartNew(runThis); 
    } 

    private void runThis() 
    { 
     //get the path 
     string get_the_path = path; 

     XDocument doc = XDocument.Load(get_the_path); 
     var transac = from r in doc.Descendants("Transaction") 
         select new { 
          InvoiceNumber = r.Element("InvoiceNumber").Value, 
         }; 
     listBox2.Invoke((MethodInvoker)delegate() { 
      foreach(var r in transac){ 
       listBox2.Items.Add(r.ToString()); 
      } 
     }); 

risposta

4

Provare a utilizzare XDocument.Load(Stream) con le opzioni di sola lettura:

using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) 
{ 
    var doc = XDocument.Load(stream); 

    // ... 
} 
+0

ancora lo stesso, provato! :( – GrayFullBuster

+0

hey è una correzione, ho appena aggiunto questo "FileShare.ReadWrite" – GrayFullBuster

+0

Non funziona Ho fatto lo stesso –

2

Stai condividendo la variabile percorso su tutte le attività senza bloccare. Ciò significa che tutte le attività potrebbero tentare di accedere allo stesso file nello stesso momento. Si dovrebbe essere passando il percorso come una variabile per startTask():

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e) 
{ 
    if (!listBox1.Items.Contains(e.FullPath)) 
    { 
     //add path 
     listBox1.Items.Add(e.FullPath + "" + DateTime.Now.ToString()); 

     //start task 
     startTask(e.FullPath); 
    } 
} 

private void startTask(string path) 
{ 
    //start task 
    Task t = Task.Factory.StartNew(() => runThis(path)); 
} 

private void runThis(string path){} 

EDIT: Questo thread: Is there a way to check if a file is in use? ha un controllo semplice e brutta per l'accesso ai file si potrebbe provare che per testare il file, se non riesce poi salta il file o attendi e riprova.

+0

sempre lo stesso, ho provato già :( – GrayFullBuster

+0

che sta scrivendo i file Possono segnalare quando hanno finito –

+0

un'altra applicazione per la creazione del?? file., potrebbe anche essere il più di un computer utilizzerà quell'applicazione – GrayFullBuster

Problemi correlati