C#控制台如何保存输出最简单的版本?

时间:2018-08-31 10:44:11

标签: c# console output

我是C#的新手;有人知道如何在不启动新进程的情况下将所有输出行写入.txt文件吗?

此代码仅写入最后一条记录:

class Program
{
    static void Main(string[] args)
    {
        WezKomponent("Win32_DiskDrive", "Model");

        Console.ReadKey();
    }

    private static void WezKomponent(string ass, string sax)
    {
        ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass);

        foreach (ManagementObject pie in wez.Get())
        {
            Console.WriteLine(Convert.ToString(pie[sax]));

            StreamWriter SW = new StreamWriter(@"HDD.txt");
            SW.WriteLine(Convert.ToString(pie[sax]));
            SW.Close();
        }
    }
}

3 个答案:

答案 0 :(得分:0)

实际上,它确实确实将所有记录都写入了文件,问题是您每次都覆盖文件,因此观察是仅保留最后一条记录。

有两种解决方法:

  1. 在循环之前打开文件,写入所有记录,然后关闭文件
  2. 在循环中打开文件,但是要以添加新内容的方式进行

通常,正确选择第一个比较容易,所以这是这样做的方法:

  1. 向上移动流
  2. 将流的关闭向下移出进行循环

从本质上讲,您采用了以下代码行:

private static void WezKomponent(string ass, string sax)
{
    ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass);
    foreach (ManagementObject pie in wez.Get())
    {
        Console.WriteLine(Convert.ToString(pie[sax]));

        StreamWriter SW = new StreamWriter(@"HDD.txt");
        SW.WriteLine(Convert.ToString(pie[sax]));
        SW.Close();
    }
}

并将其更改为此:

private static void WezKomponent(string ass, string sax)
{
    ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass);

    StreamWriter SW = new StreamWriter(@"HDD.txt");
    foreach (ManagementObject pie in wez.Get())
    {
        Console.WriteLine(Convert.ToString(pie[sax]));

        SW.WriteLine(Convert.ToString(pie[sax]));
    }
    SW.Close();
}

另外,为了在出现错误时更加安全,最好使用以下语法:

using (... = new SomethingThatImplementsIDisposable(...))
{
}

比这个:

... = new SomethingThatImplementsIDisposable(...);
...
...Close(); // or .Dispose();

所以这是您方法的更好版本:

private static void WezKomponent(string ass, string sax)
{
    using (ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass))
    using (StreamWriter SW = new StreamWriter(@"HDD.txt"))
    {
        foreach (ManagementObject pie in wez.Get())
        {
            Console.WriteLine(Convert.ToString(pie[sax]));

            SW.WriteLine(Convert.ToString(pie[sax]));
        }
    }
}

之所以更好,是因为代码中有异常的可能性。如果发生这种情况,SW.Close();将不会执行,这意味着您将流和文件保持打开状态,至少要比预期的时间更长。使用这样的using子句,如果内部发生异常,则将调用这些对象上的Dispose方法,关闭文件,在这种情况下也将调用ManagementObjectSearcher对象。 / p>


那么有什么方法可以进一步改善代码?是的,但是只有当您知道我将要展示或愿意学习的其他语法时,才可以。既然您说过您是C#的新手,那么您可能不知道它,并且您可能希望先熟悉现有代码,然后再从自己的角度考虑使其变得更加复杂。

有多种写入文本文件的方法,StreamWriter是其中的一种,File.WriteAllLines是另一种,但是这希望写入的内容以字符串的集合形式提供,这些字符串将被写为文件的一系列行。

那么我们如何从您的ManagementObjectSearcher对象中获取字符串列表?

通过一组语法和.NET类统称为“ LINQ”或“语言集成查询”。

这是您的方法的简短版本:

private static void WezKomponent(string ass, string sax)
{
    using (ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass))
    {
        File.WriteAllLines(@"HDD.txt", wez
            .Get()
            .Select(pie => ConvertToString(pie[sax])));
    }
}

甚至可以将其缩短为仅在每行上放置更多并删除一些不必要的花括号,并在容易从周围的代码中识别出确切类型时使用var

private static void WezKomponent(string ass, string sax)
{
    using (var wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass))
        File.WriteAllLines(@"HDD.txt", wez.Get().Select(pie => ConvertToString(pie[sax])));
}

答案 1 :(得分:0)

class Program
{
    static void Main(string[] args)
    {

        WezKomponent("Win32_DiskDrive", "Model");

        Console.ReadKey();

    }
    private static void WezKomponent(string ass, string sax)
    {
        ManagementObjectSearcher wez = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM " + ass);

        StreamWriter SW = new StreamWriter(@"HDD.txt");
        foreach (ManagementObject pie in wez.Get())





        {

            Console.WriteLine(Convert.ToString(pie[sax]));

            SW.WriteLine(Convert.ToString(pie[sax]));



        }
        SW.Close();
    }

答案 2 :(得分:0)

尝试以其他方式初始化StreamWriter。

StreamWriter SW = new StreamWriter(@"HDD.txt", append: true);

在构造函数调用中注意append: true