2012-11-23 28 views
6

Stworzyłem aplikację, która będzie oglądała pewien folder tylko dla nowo utworzonych plików i wyświetla je w polu listy, teraz chcę to zrobić za każdym razem, gdy wykryje plik aplikacja przeczyta ją i wyświetli tekst na niej w polu listy, prawie dostałem, ponieważ czasami gdy wykryje 2 lub 3, 4, 6, 6 itd pliki czasami są ok, ale czasami również monituje błąd "Proces nie może uzyskać dostępu do pliku" C: \ Users \ PHWS13 \ Desktop \ 7.request.xml, ponieważ jest używany przez inny proces. ".Plik jest używany przez inny proces z FileSystemWatcher i Zadanie

Jak to naprawić? Oto mój kod:

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()); 
      } 
     }); 

Odpowiedz

4

Spróbuj użyć XDocument.Load(Stream) z opcjami read-only:

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

    // ... 
} 
+0

wciąż to samo, wypróbowane! :( – GrayFullBuster

+0

hej, to jest poprawka, właśnie dodałem to "FileShare.ReadWrite" – GrayFullBuster

+0

Nie działa Zrobiłem to samo –

2

Udostępniasz zmienną ścieżki we wszystkich zadaniach bez blokowania. Oznacza to, że wszystkie twoje zadania mogą próbować uzyskać dostęp do tego samego pliku w tym samym czasie. Powinieneś być przechodząc ścieżkę jako zmienna do 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: Wątek: Is there a way to check if a file is in use? posiada prosty i brzydki czek na dostęp do plików można spróbować przetestować ten plik, jeśli nie jest on wówczas pomiń plik lub czekaj i spróbuj ponownie.

+0

wciąż ten sam, próbowałem go już :( – GrayFullBuster

+0

Kto pisze te pliki mogą one sygnalizować kiedy skończysz –

+0

innej aplikacji do tworzenia? pliki., może to być również więcej niż jeden komputer będzie używał tej aplikacji – GrayFullBuster