我创建了一个应用程序,它只会为新创建的文件查看某个文件夹并将其列在列表框中,现在我想要做的是每当它检测到应用程序将读取它的文件并在其中显示文本时列表框,我几乎得到,因为有时当它检测到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());
}
});
答案 0 :(得分:4)
尝试将XDocument.Load(Stream)
与只读选项一起使用:
using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
{
var doc = XDocument.Load(stream);
// ...
}
答案 1 :(得分: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){}
编辑: 这个帖子:Is there a way to check if a file is in use?有一个简单而丑陋的文件访问检查,您可以尝试测试该文件,如果失败则跳过该文件或等待再试一次。