亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 193 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號