如何" Unaccess"一个文件,所以程序的其他部分可以访问它

时间:2015-04-17 03:41:51

标签: c# runtime-error file-access

我在我的程序中分散了以下代码。但是我似乎总是得到以下错误。即使我使用“使用括号”处理资源,我仍然不知道为什么会发生这种情况。

错误:

  

进程无法访问文件“文件路径”,因为它正由另一个进程使用。

代码:

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
    {

    }
}

2 个答案:

答案 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))
...