1

我的应用程序正在写入的 \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

4 回答 4

3

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

您需要了解FileModeFileAccessFileShare枚举。

第一个,FileMode,指定您打算对文件的存在执行什么操作。上面的链接中记录了各种选项。我认为您在这里没有问题,但值得一提。

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

最后一个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();
    }
}

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

于 2012-07-05T14:59:06.563 回答
1

对于文件操作(以及您访问非托管资源的任何时间),最好的办法是只抓住文件的句柄,时间长到足以执行您想要的操作,然后释放它。

在您的情况下,您正在打开资源,然后尝试稍后再次打开它。改变这个。在您真正要对它做某事之前,不要创建文件。另外,查看USING条款。您希望在完成读取或写入后立即释放它。

于 2012-07-05T14:35:15.720 回答
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);


            }
         } 
于 2012-07-05T14:33:17.797 回答
-1

尝试使用using.

using (StreamWriter sw = new StreamWriter(myfile))
{
    sw.Write(textBox1.text);
}
于 2012-07-05T14:32:46.993 回答