控制台写入文件问题

时间:2014-05-18 22:02:56

标签: c# console-application filewriter

这是我写入文件的功能:

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.

我的代码有什么问题?

1 个答案:

答案 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,然后传递该对象,以便只打开文件一次并关闭文件一次。如果它是一个长时间运行的程序,你可以为每个“工作单元”(请求,周期性中断,等等)制作这些对象之一。但是,这不是你要求的。