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 关注
- 203 浏览
添加回答
举报