我测了如下一段代码,发现有bug: private void Func()
{
FileStream fs= new FileStream("C:\\1.txt", FileMode.Open);
StreamReader reader = new StreamReader(fs,true);
TestBug(fs, reader);
fs.Close();
fs.Dispose();
reader.Close();
} private void TestBug(FileStream fs, StreamReader reader)
{
fs.Close();
fs = new FileStream("C:\\1.txt", FileMode.Open);
//To do..
}第二次调用Func()的时候提示文件已经被占用;如果不直接传入FileStream而是在调用函数之前将其关闭,结束函数后再次将其打开就没这问题。也就是说在TestBug(fs,reader)里面fs没有被关闭;那么请问如何在函数里面对FileStream进行正确的关闭释放操作?
{
FileStream fs= new FileStream("C:\\1.txt", FileMode.Open);
StreamReader reader = new StreamReader(fs,true);
TestBug(fs, reader);
fs.Close();
fs.Dispose();
reader.Close();
} private void TestBug(FileStream fs, StreamReader reader)
{
fs.Close();
fs = new FileStream("C:\\1.txt", FileMode.Open);
//To do..
}第二次调用Func()的时候提示文件已经被占用;如果不直接传入FileStream而是在调用函数之前将其关闭,结束函数后再次将其打开就没这问题。也就是说在TestBug(fs,reader)里面fs没有被关闭;那么请问如何在函数里面对FileStream进行正确的关闭释放操作?
private void TestBug(FileStream fs, StreamReader reader)
{
fs.Close();
fs = new FileStream("C:\\1.txt", FileMode.Open);
//To do..
}
你这样会导致指向两个不一样的对象,应该加上ref
private void TestBug(ref FileStream fs, StreamReader reader)
{
fs.Close();
fs = new FileStream("C:\\1.txt", FileMode.Open);
//To do..
}
再试试
啊。。这个方法是可用的,原来是产生了两个不一样的FileStream,请问如果要理解的更清楚的话可用查阅哪些资料呢?谢谢。我接触C#不多,对于这些方面的东西所知甚少。
private void Func()
{
using(FileStream fs= new FileStream("C:\\1.txt", FileMode.Open))
using(StreamReader reader = new StreamReader(fs,true))
{
TestBug(fs, reader);
}
} private void TestBug(FileStream fs, StreamReader reader)
{
//To do..
}