【问题标题】:Console write in file issue控制台写入文件问题
【发布时间】:2014-07-06 19:08:50
【问题描述】:

这是我在文件中写入的函数:

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.

我的代码有什么问题?

【问题讨论】:

  • 您重定向控制台只是为了写入文件有什么特别的原因吗? StreamWriter 具有用于编写看起来像 Console 对象的字符串的方法。 IMO 无需在此处重定向控制台并使用 Console.WriteLine,除非您的程序的其他部分使用 Console.WriteLine,您有时需要将其定向到文件。

标签: c# console-application filewriter


【解决方案1】:

您的问题是您要关闭文件流两次。第一次调用完成后,您已经关闭了文件,因此当您第二次调用时,它会尝试在已关闭的文件流上创建流写入器。

删除file.Close 并将您的参数类型更改为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 然后传递该对象,以便您只打开文件一次并关闭文件一次。如果它是一个长时间运行的程序,您将为每个“工作单元”(请求、周期性中断等)创建这些对象之一。但是,这不是您要求的。

【讨论】:

  • 它有效,但我只写了最后一行我认为在每次调用中他删除文件内容并只写入新内容
  • 好的,在这种情况下,将两个using 行替换为:using(var sw = File.AppendText(fileName))(两个using 语句只替换为一个)。 File.AppendText 静态方法负责打开文件并确保它处于附加模式。这将在附加新内容的同时保留现有文件内容。这是你想要完成的吗?
  • 试图改变这个我得到Cannot open Redirect.txt for writing错误
  • 几个问题:它在第一次通话时有效,但在第二次通话时无效?您的进程是否有权访问该文件?是否被其他进程锁定?
  • 是的,它不适用于第二次通话,但第一次很好,我喜欢这样看我的编辑
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2020-04-10
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多