文件流正在被另一个进程使用。

6
FileStream f=new FileStream("c:\\file.xml",FileMode.Create);
StreamWriter sf=new StreamWriter(f);
sf.WriteLine(stroka);
sf.Close();
sf.Dispose();
f.Close();
f.Dispose();
FileStream f1=new FileStream("c:\\file.xml",FileMode.Open);
StreamReader sr=new StreamReader("c:\\file.xml");
xmlreader=new XmlTextReader(sr);
sr.Close();
sr.Dispose();
f1.Close();
f1.Dispose();

我遇到了这个错误:

由于正在被其它进程使用,无法访问文件 'c:\file.xml'

我已经关闭和释放所有东西了,为什么还是出现问题呢?

4个回答

9

替换:

StreamReader sr=new StreamReader("c:\\file.xml");

使用:

StreamReader sr=new StreamReader(f1);

您正在创建没有FileStream的新StreamReader
附加数据:
  • StreamReader对象在调用StreamReader.Dispose时会对提供的Stream对象调用Dispose

  • Dispose方法会调用Close方法。阅读此文了解更多信息。

意思是:您可以从FileStream中删除您编写的DisposeClose
FileStream f = new FileStream("c:\\file.xml", FileMode.Create);
StreamWriter sf = new StreamWriter(f);
sf.WriteLine(stroka);
sf.Dispose();

FileStream f1 = new FileStream("c:\\file.xml", FileMode.Open);
StreamReader sr = new StreamReader(f1);
xmlreader = new XmlTextReader(sr);
sr.Dispose();

但是对于非托管资源,你真的应该使用 using statement,阅读此文


我遇到了这个问题,请注意在“Disposing”之前应该“Close”流。 - Mironline
@Mironline。这是自动完成的。请阅读我的回答中的所有内容...您可以在此处查看Dispose在做什么(https://dev59.com/NnNA5IYBdhLWcg3wjOzf#911431) - gdoron

2
您有一个针对同一文件的FileStream和StreamReader。 请删除此行:
FileStream f1=new FileStream("c:\\file.xml",FileMode.Open);     

2
改变
StreamReader sr=new StreamReader("c:\\file.xml"); 

to

StreamReader sr=new StreamReader(f1); 

以下两行代码都是尝试访问同一文件的单独对象:

FileStream f1=new FileStream("c:\\file.xml",FileMode.Open); 
StreamReader sr=new StreamReader("c:\\file.xml"); 

因此每个人都试图单独访问该文件,而将您的代码更改为我的连接方式会使'sr'通过f1访问该文件。

1

问题可能出在这里:

FileStream f1=new FileStream("c:\\file.xml",FileMode.Open);
StreamReader sr=new StreamReader("c:\\file.xml");

Filestream 可能正在访问文件,然后 StreamReader 尝试单独访问该文件。尝试让您的 StreamReader 使用相同定义的 Stream。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接