文件已被访问错误

时间:2012-07-05 14:26:45

标签: c# file appdata roaming

我的应用正在写入的\ AppData \ Roaming中有一些文件。我在应用程序启动时创建文件:

private void Form1_Load(object sender, EventArgs e)
{
DirectoryInfo _File = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
}

稍后,当我通过单击按钮写入文件时,我收到一条错误消息,指出该文件已被使用且无法访问。我该如何解决这个问题?

写入文件的代码是正确的,因为当我删除上面的代码并自己制作文件时,应用程序会写入它们而不会出现任何问题。因此,我不认为问题是我用来写入文件的代码。但是,这里仅供参考:

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
StreamWriter sw = new StreamWriter(myfile);
sw.WriteLine(textBox1.text);
sw.Close();

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

这里有一些概念,我不确定我们是否有足够的信息来明确解决根本问题,但我会给你一些指示。

您需要了解FileModeFileAccessFileShare枚举。

第一个 FileMode ,指定您要对文件的存在做什么。上面的链接中记录了各种选项。我不认为你这里有问题,但值得一提。

第二个 FileAccess 涉及您与文件的预期交互(读取,写入或两者)。如果您要求阅读权限,则打开该文件或已将其打开的任何其他人(包括该网络浏览器控件)必须允许与其他读者共享。

最后一个 FileShare ,定义您愿意与谁共享文件的访问权限。您可以指定其他人可以阅读,其他人可以写入,或两者都可以。

您使用的代码是使用最简单的默认值访问文件,这可能与WebBrowser的访问模式不兼容。以下是我建议的内容:

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
using (var fs = new FileStream(myfile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) {
    using (var sw = new StreamWriter(fs)) {

        // You probably want to move to the end of the file before writing...
        fs.Seek(0, SeekOrigin.End);

        sw.WriteLine(textBox1.text);
        sw.Close();
    }
}

这非常清楚地表达了您的意图,以及您愿意与可能读取或写入的其他人共享的事实(我们知道Web浏览器不会写入文件,但出于某种原因,可能会尝试打开无论如何它都有写意图。)

答案 1 :(得分:1)

对于文件操作(以及您访问非托管资源的任何时候),最好的办法是只抓取文件句柄足够长的时间来执行所需的操作,然后将其释放。

在您的情况下,您正在打开资源,然后尝试稍后再次打开它。改变这个。在实际使用它之前,请不要创建文件。另外,请查看USING子句。您希望在完成阅读或写作后立即将其发布。

答案 2 :(得分:0)

尝试访问FileInfo对象以创建/追加/写入文件,如下所示,该文件已由FileInfo类获取,

使用如下,

 FileInfo fi1 = new FileInfo(path);

        //Create a file to write to.
        using (StreamWriter sw = fi1.CreateText()) 
        {
            sw.WriteLine("Hello");
            sw.WriteLine("And");
            sw.WriteLine("Welcome");
        }   

        //Open the file to read from.
        using (StreamReader sr = fi1.OpenText()) 
        {
            string s = "";
            while ((s = sr.ReadLine()) != null) 
            {
                Console.WriteLine(s);


            }
         } 

答案 3 :(得分:-1)

尝试使用using

using (StreamWriter sw = new StreamWriter(myfile))
{
    sw.Write(textBox1.text);
}