控制台应用程序中的可选输出文件 - 使StreamWriter全局化

时间:2009-07-16 18:11:44

标签: c#

我正在编写一个控制台应用程序,它正在查找有关SQL Server中SSIS包的信息。我有它工作并写入.csv文件。我刚刚添加了为servername,foldername和outputfile传递命令行开关的功能。如果没有指定输出文件,我只想输出到控制台,我已经在做了。

我处理文件写作的方式看起来很尴尬,可能是错误的。

在我的main方法中,我创建了一个StreamWriter。我需要将程序的整个输出写入此文件。我通过递归调用函数来探索指定文件夹下的文件夹。

我在所有调用中传递StreamWriter对象 - 它是不使用它的函数中的参数,因此它可以传递给那个函数。看起来我应该能够使它成为一个全局变量,但我发现c#没有全局变量,“如果你使用的是全局变量,那么你可能做错了”。

我计划在插入这个小实用程序一段时间之后最终重新审视这个问题,但我现在遇到的问题是所有函数都需要StreamWriter对象 - 如果我使它成为可选的,那么它就不会在那里履行职责。而且似乎c#也没有做可选参数。

我相信你可以告诉我,我不是c#专家,只在我需要的时候才会涉猎。谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

您想使用singleton模式来引用您正在使用的StreamWriter。单例是一种“模拟”全局变量功能的方法,而不会出现问题。

基本上,单例提供的是您希望在应用程序的许多不同部分之间共享的特定于类的实例。通过静态类实例访问资源。

实际上,您要做的是定义一个类,该类具有您想要使用的StreamWriter作为公共静态成员;通过这种方式,您在其余代码中使用的任何方法都可以通过从包含类访问它来访问StreamWriter的SAME实例(无需创建类的实例,因为它是静态的)。 p>

答案 1 :(得分:1)

这样的东西
public static class CsvWriter
{
   private static StreamWriter _writer = new StreamWriter(...);

   public static  StreamWriter Writer 
   {
      get { return _writer; }
   }
}

可能有一些变化,主要项目是静态属性。它就像一个全球而不是(完全)坏。

答案 2 :(得分:0)

同一类的所有功能都是?您可以创建一个类变量(一个字段)并从该类的所有方法访问它。如果不是,您始终可以使用静态字段创建新的公共类。

答案 3 :(得分:0)

我可以使用Console.SetOut

static void Main(string[] args)
{
    StreamWriter writer = new StreamWriter(@"c:\path\file.ext");
    try
    {
        Console.SetOut(writer);
        Console.WriteLine("One");
        Console.WriteLine("Two");
        Console.WriteLine("Three");
    }
    catch (Exception ex)
    {
        Console.WriteLine("That went wrong.");
    }
    finally
    {
        writer.Dispose();
    }    
}