3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
實(shí)際上,它確實(shí)將所有記錄寫入文件,問(wèn)題是每次都覆蓋文件,因此您觀察到只保留最后一條記錄。
對(duì)此有兩種解決方案:
在循環(huán)之前打開(kāi)文件,寫入所有記錄,然后關(guān)閉文件
在循環(huán)內(nèi)打開(kāi)文件,但以追加新內(nèi)容的方式進(jìn)行
一般來(lái)說(shuō),讓第一個(gè)正確更容易,所以這里是如何做到這一點(diǎn)的:
移動(dòng)流的開(kāi)放起來(lái),并從循環(huán)
移動(dòng)流的收盤下跌,并走出循環(huán)
本質(zhì)上,您采用以下代碼行:
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();
}
此外,為了在出現(xiàn)錯(cuò)誤時(shí)更加安全,最好使用以下語(yǔ)法:
using (... = new SomethingThatImplementsIDisposable(...))
{
}
比這個(gè):
... = 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]));
}
}
}
之所以這樣更好,是因?yàn)槟拇a中可能會(huì)出現(xiàn)異常。如果發(fā)生這種情況,SW.Close();將不會(huì)被執(zhí)行,這意味著您將流和文件保持打開(kāi)狀態(tài),至少比預(yù)期的時(shí)間長(zhǎng)。使用這樣的using子句,如果內(nèi)部發(fā)生異常,Dispose將調(diào)用這些對(duì)象上的方法,關(guān)閉文件,在這種情況下也關(guān)閉ManagementObjectSearcher對(duì)象。
那么有什么方法可以進(jìn)一步改進(jìn)您的代碼嗎?是的,但前提是您知道我將要展示的其他語(yǔ)法,或者愿意學(xué)習(xí)。既然你說(shuō)你是 C# 的新手,你可能不知道它,并且你可能希望先熟悉現(xiàn)有的代碼,然后再讓它從你的角度變得更加復(fù)雜。
有多種寫入文本文件的方法,StreamWriter其中一種方法File.WriteAllLines是另一種方法,但這期望寫入的內(nèi)容作為字符串集合提供,這些字符串將作為一系列行寫入文件。
那么我們?cè)鯓硬拍軓哪愕腗anagementObjectSearcher對(duì)象獲得一個(gè)字符串列表呢?
通過(guò)一組統(tǒng)稱為“LINQ”或“語(yǔ)言集成查詢”的語(yǔ)法和 .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])));
}
}
這甚至可以縮短為在每一行上添加更多內(nèi)容并刪除一些不必要的大括號(hào),并var在可以輕松從周圍代碼中辨別出確切類型時(shí)使用:
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貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
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貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
嘗試以不同的方式初始化 StreamWriter。
StreamWriter SW = new StreamWriter(@"HDD.txt", append: true);
注意append: true
在構(gòu)造函數(shù)調(diào)用中。
- 3 回答
- 0 關(guān)注
- 190 瀏覽
添加回答
舉報(bào)