6

新しく作成されたファイルのみを特定のフォルダーで監視し、リストボックスに一覧表示するアプリケーションを作成しました。今やりたいのは、ファイルを検出するたびに、アプリケーションがそれを読み取り、そのテキストをリストボックスに表示することです。 2つまたは3,4,5,6などのファイルを検出すると、時々問題が発生することがありますが、「プロセスはファイル 'C:\Users\PHWS13\Desktop\7.request.xmlにアクセスできません」というエラーが表示されることがあるため、ほとんど取得しました「別のプロセスで使用されているためです。」

これを修正する方法は?これが私のコードです:

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

2 に答える 2

4

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

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

    // ...
}
于 2012-11-23T02:47:35.507 に答える
2

ロックせずにすべてのタスクでパス変数を共有しています。これは、すべてのタスクが同時に同じファイルにアクセスしようとしている可能性があることを意味します。パスを変数として 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){}

編集: このスレッド:ファイルが使用中かどうかを確認する方法はありますか? ファイルアクセスの単純で醜いチェックがあり、ファイルをテストするためにそれを試すことができます。失敗した場合は、ファイルをスキップするか、待ってから再試行してください。

于 2012-11-23T02:03:58.737 に答える