2012-11-23 76 views
6

新しく作成されたファイルのみの特定のフォルダを監視し、リストボックスに表示するアプリケーションを作成しました。アプリケーションはそれを読んで、テキストをリストボックスに表示しますが、時には2、3,4,5,6などのファイルを検出することもありますが、時にはエラーをプロンプトすることもあるので、 C:\ Users \ PHWS13 \ Desktop \ 7.request.xml 'は別のプロセスで使用されているためです。 "ファイルがFileSystemWatcherとタスクで別のプロセスで使用されています

これを修正するにはどうすればよいですか?

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

答えて

4

読み取り専用のオプションでXDocument.Load(Stream)を使用してみてください:

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

    // ... 
} 
+0

まだ同じ、試してみました! :( – GrayFullBuster

+0

ちょっと修正して、私はこの "FileShare.ReadWrite"を追加しました – GrayFullBuster

+0

私は同じことをしました –

2

あなたがロックすることなく、すべてのタスクにパス変数を共有している:ここに私のコードです。つまり、すべてのタスクが同じファイルに同時にアクセスしようとしている可能性があります。あなたは、タスク開始()への変数としてパスを渡すべきである:

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: このスレッド:Is there a way to check if a file is in use?は、ファイルアクセスのためのシンプルかつ醜いチェックあなたはそれに失敗した場合には、ファイルをテストしようとすることができていファイルをスキップするか、待ってからもう一度試してください。

+0

同じ、私はすでにそれを試してみました:(ファイルを書き込んだ – GrayFullBuster

+0

を彼らが終わったときに信号を送ることができる –

+0

別のアプリケーションを作成するために?複数のコンピュータがそのアプリケーションを使用する可能性もあります。 – GrayFullBuster

関連する問題