2012-11-23 29 views
6

ile kullanılıyor. Sadece yeni oluşturulan dosyalar için belirli bir klasörü izleyecek ve liste kutusunda listeleyecek bir uygulama oluşturdum, şimdi yapmak istediğim, dosyayı her defasında algılayacak Uygulama bunu okuyacak ve liste kutusundaki metni gösterecek, neredeyse var çünkü bazen 2 veya 3,4,5,6 vb. dosyaları tespit ettiğinde bazen tamam ama bazen "hata" işlemi "dosyaya erişemiyor" C: \ Users \ PHWS13 \ Desktop \ 7.request.xml 'çünkü başka bir işlem tarafından kullanılıyor.Dosya başka bir işlem tarafından FileSystemWatcher ve Task

Bunu nasıl düzeltebilirim? İşte benim kodum:

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

cevap

4

salt okunur seçenekleri ile XDocument.Load(Stream) kullanmayı deneyin:

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

    // ... 
} 
+0

hala aynı, denedi! :( – GrayFullBuster

+0

hey, ben sadece bunu ekledim "FileShare.ReadWrite" – GrayFullBuster

+0

Çalışmıyor Not Aynı şeyi yaptım –

2

Yol değişkeni kilitlenmeden tüm görevlerde paylaşıyorsunuz. Bu, tüm görevlerinizin aynı dosyaya aynı anda erişmeye çalıştığı anlamına gelir. Sen startTask() için bir değişken olarak yolu geçen edilmelidir:

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){} 

DÜZENLEME: Bu thread: Is there a way to check if a file is in use? dosya erişimi için basit ve çirkin çeki Eğer o zaman alamadığı takdirde, dosyayı test deneyebilirsiniz vardır dosyayı atlayın veya bekleyin ve tekrar deneyin.

+0

aynı, zaten denedim :(dosyaları yazıyor – GrayFullBuster

+0

onlar bitince sinyal Can –

+0

başka bir uygulama oluşturmak için? dosyaları., aynı zamanda bu uygulamayı kullanacak birden fazla bilgisayar olabilir – GrayFullBuster