2012-07-05 30 views
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(); 

在此先感谢您的帮助!

+0

除了上面第二个示例中发布的代码之外,是否有任何操作尝试访问该文件?例如,你是否尝试阅读他们的内容并把它放在用户界面的某个地方? – 2012-07-05 14:33:05

+0

@ChrisShain我在应用程序的WebBrowser中查看文件。这是一个通过浏览器访问的HTML文件。除此之外,没有别的东西可以访问该文件。 – Nathan 2012-07-05 14:38:54

回答

3

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

您需要了解FileMode,FileAccessFileShare枚举。

第一个,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浏览器将无法写入文件,但由于某种原因,也许它试图用写意图打开它)。

+0

这很棒!谢谢你的帮助! – Nathan 2012-07-05 17:10:42

+0

+1以获得非常完整的答案。 – NotMe 2012-07-06 16:12:05

-1

尝试使用using

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

小心点评为什么投票不中? – Asdfg 2012-07-05 14:36:19

+0

我没有给你DV,但你的解决方案不太可能帮助,因为OP已经关闭了StreamWriter。 – 2012-07-05 14:39:30

+0

,但使用使用总是更好。 – Asdfg 2012-07-05 14:41:18

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); 


      } 
     } 
1

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

就你而言,你打开资源,然后尝试稍后再打开它。改变这一点。除非你真的要对它做些什么,否则不要创建这些文件。另外,请查看USING条款。您希望在读完或写完后立即发布它。