3 回答

TA貢獻1871條經驗 獲得超8個贊
實際上,它確實將所有記錄寫入文件,問題是每次都覆蓋文件,因此您觀察到只保留最后一條記錄。
對此有兩種解決方案:
在循環之前打開文件,寫入所有記錄,然后關閉文件
在循環內打開文件,但以追加新內容的方式進行
一般來說,讓第一個正確更容易,所以這里是如何做到這一點的:
移動流的開放起來,并從循環
移動流的收盤下跌,并走出循環
本質上,您采用以下代碼行:
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])));
}

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

TA貢獻1906條經驗 獲得超3個贊
嘗試以不同的方式初始化 StreamWriter。
StreamWriter SW = new StreamWriter(@"HDD.txt", append: true);
注意append: true
在構造函數調用中。
- 3 回答
- 0 關注
- 193 瀏覽
添加回答
舉報