我在我的程序中分散了以下代码。但是我似乎总是得到以下错误。即使我使用“使用括号”处理资源,我仍然不知道为什么会发生这种情况。
错误:
进程无法访问文件“文件路径”,因为它正由另一个进程使用。
代码:
string folderpath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "AGoogleHistory");
string filecreate;
private void restoreTbasToolStripMenuItem_Click(object sender, EventArgs e)
{
using(StreamReader sr = new StreamReader(filecreate))
{
string s = sr.ReadToEnd();
MessageBox.Show(s, "History", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
try
{
browser.Navigate(new Uri(Address));
using(StreamWriter sw = new StreamWriter(filecreate))
{
sw.WriteLine(Address);
}
}
catch(System.UriFormatException)
{
return;
}
private void clearToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Are You Sure", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
File.Delete(filecreate);
}
else
{
}
}
答案 0 :(得分:0)
我认为您应首先通过
检查该文件是否存在File.Exists(filePath);
第二件事是您将错误的参数传递给StreamReader
类,这是一个空字符串,因为您没有为其分配任何内容。首先检查上面提到的内容,您可以参考下面的链接以方便您使用:
The process cannot access file...
尝试此操作后,如果您有任何其他问题,请告诉我。
答案 1 :(得分:0)
默认情况下,StreamReader会锁定文件。这会导致您看到的错误。幸运的是,StreamReader接受一个流作为它的构造函数的重载之一。这允许您首先创建一个FileStream,它有一个方便的枚举,允许您指定读/写共享,然后将该FileStream传递给您的StreamReader以供使用。
所以在你的情况下:
using(StreamReader sr = new StreamReader(filecreate))
...
变为:
FileStream fs = new FileStream(filecreate, FileMode.Open, FileShare.ReadWrite);
using(StreamReader sr = new StreamReader(fs))
...
有关详情,请参阅以下问题。它的问题基本相同,只是提出了不同的问题。接受的答案应该解释一下。
How to open a StreamReader in ShareDenyWrite mode?
修改强>
再次查看您的问题,我发现您的部分问题是您没有关闭您的信息流。当使用块退出时,应关闭,但最好使用sr.Close();
此外,您可能需要将删除标志添加到fileshare选项:
FileStream fs = new FileStream(filecreate, FileMode.Open, FileShare.ReadWrite|FileShare.Delete);
using(StreamReader sr = new StreamReader(fs))
...