这是我写入文件的功能:
FileStream file = new FileStream ("c:/Redirect.txt", FileMode.OpenOrCreate, FileAccess.Write);
public void writeFile(string line, FileStream file)
{
StreamWriter writer;
TextWriter oldOut = Console.Out;
try
{
writer = new StreamWriter(file);
}
catch (Exception e)
{
Console.WriteLine("Cannot open Redirect.txt for writing");
Console.WriteLine(e.Message);
return;
}
Console.SetOut(writer);
Console.WriteLine(line);
Console.SetOut(oldOut);
writer.Close();
file.Close();
Console.WriteLine("Done");
}
这就是我如何使用它:
writeFile("********* Clienta *********",file);
writeFile("Centre *** " + id,file);
但是当我运行我的代码时,我收到了这个错误:
Cannot open Redirect.txt for writing
The stream can not be written.
我的代码有什么问题?
答案 0 :(得分:1)
您的问题是您要关闭文件流两次。第一次调用完成后,您已关闭该文件,因此当您第二次调用时,它会尝试在已关闭的文件流上创建一个编写器。
删除file.Close
并将参数类型更改为StreamWriter
。在函数外部创建您的streamwriter,当您完成文件编写后,关闭它。
尝试这样的事情:
public void WriteFile(string line, string fileName)
{
try
{
using (var sw = new StreamWriter(fileName, true))
{
sw.WriteLine(line);
}
}
catch (Exception e)
{
Console.WriteLine("Cannot open Redirect.txt for writing");
Console.WriteLine(e.Message);
return;
}
Console.WriteLine("Done");
}
现在,不要将文件流传递给您的函数,而是传递C:/Redirect.txt
:
WriteFile("********* Clienta *********","C:/Redirect.txt");
WriteFile("Centre *** " + id, "C:/Redirect.txt");
我会注意到:非常次优。为每次调用此函数打开和关闭文件效率非常低。更好的方法是使用一个对象将消息写入文件,跟踪StreamWriter和FileStream,然后传递该对象,以便只打开文件一次并关闭文件一次。如果它是一个长时间运行的程序,你可以为每个“工作单元”(请求,周期性中断,等等)制作这些对象之一。但是,这不是你要求的。