为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
SMILET 2021-12-25 16:43:23
我对 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 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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

对此有两种解决方案:

  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对象。


那么有什么方法可以进一步改进您的代码吗?是的,但前提是您知道我将要展示的其他语法,或者愿意学习。既然你说你是 C# 的新手,你可能不知道它,并且你可能希望先熟悉现有的代码,然后再让它从你的角度变得更加复杂。


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


那么我们怎样才能从你的ManagementObjectSearcher对象获得一个字符串列表呢?


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


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


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])));

}


查看完整回答
反对 回复 2021-12-25
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

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();

    }


查看完整回答
反对 回复 2021-12-25
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

尝试以不同的方式初始化 StreamWriter。

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

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


查看完整回答
反对 回复 2021-12-25
  • 3 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号