2014-05-18 24 views
-1

这是我的功能在文件中写入:控制台写

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

是否有任何特定的原因,你重定向控制台只是为了写入文件? 'StreamWriter'具有编写看起来像'Console'对象的字符串的方法。国际海事组织没有必要在这里重定向控制台并使用'Console.WriteLine',除非你的程序的其他部分使用'Console.WriteLine',有时你需要指向一个文件。 –

回答

1

你的问题是你正在关闭文件流两次。第一次调用完成后,您已关闭文件,因此当您第二次调用时,它会尝试在已关闭的文件流上创建一个Streamwriter。

删除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"); 
    } 

现在,而不是在你的FILESTREAM传递给你的函数,通过在你的C:/Redirect.txt

WriteFile("********* Clienta *********","C:/Redirect.txt"); 
WriteFile("Centre *** " + id, "C:/Redirect.txt"); 

我想指出:这是很子最佳。打开和关闭一个文件来调用这个函数是非常低效的。这样做的更好的方法是创建一个对象,将消息写入文件,以跟踪StreamWriter和FileStream,然后传递该对象,以便只打开一次文件并关闭文件一次。如果它是一个长时间运行的程序,你可以为每个“工作单元”(一个请求,周期性中断,不管)设置这些对象中的一个。但是,这不是你要求的。

+0

你可以给我代码示例吗? – Chlebta

+0

它的工作,但我只得到最后一行writed我认为在每次调用他删除文件的内容,并只写新内容 – Chlebta

+0

好吧,在这种情况下,用''使用(var sw = File.AppendText (fileName))'(两个'using'语句被替换为一个)。 ['File.AppendText'](http://msdn.microsoft.com/en-us/library/system.io.file.appendtext(v = vs.110).aspx)静态方法负责打开文件并确保它处于追加模式。这将在追加新内容的同时保留现有的文件内容。那是你想要完成的吗? –