You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET:如何将DataTable数据正确写入XML文件?

VB.NET DataTable写入XML为空的问题修复

问题根源

  1. DriveNumber未重置:第一个遍历驱动器的循环结束后,DriveNumber的数值已等于系统驱动器总数,第二个循环中该变量继续累加,导致所有DriveNumber = N的判断条件都无法触发,没有任何数据行被添加到DataTable。
  2. 错误的列添加逻辑:每个条件分支内重复添加相同的DataColumn,即使条件触发也会抛出重复列名异常。
  3. 冗余变量:代码中定义的DR1至DR5系列变量未实际使用,属于无效代码。

修复后的代码

Imports System.IO
Imports System.Net

Public Class Test
    Public Shared Sub Main()
        Dim allDrives() As DriveInfo = DriveInfo.GetDrives()
        Dim dt As New DataTable("DriveInformation")

        ' 一次性添加所有列,避免重复添加
        dt.Columns.Add(New DataColumn("Date/Time"))
        dt.Columns.Add(New DataColumn("Server"))
        dt.Columns.Add(New DataColumn("Drive"))
        dt.Columns.Add(New DataColumn("TotalSpace"))
        dt.Columns.Add(New DataColumn("UsedSpace"))
        dt.Columns.Add(New DataColumn("RemainingSpace"))
        dt.Columns.Add(New DataColumn("Status"))

        ' 输出控制台信息
        Console.WriteLine("Server Name: {0}", Dns.GetHostName)
        Console.WriteLine("Date: {0}", DateTime.Now.ToString("yyyy/MM/dd"))
        Console.WriteLine("")

        For Each d In allDrives
            Console.WriteLine("Drive {0}", d.Name)
            Console.WriteLine("  Drive type: {0}", d.DriveType)

            If d.IsReady Then
                Console.WriteLine("  Volume label: {0}", d.VolumeLabel)
                Console.WriteLine("  File system: {0}", d.DriveFormat)

                ' 处理总容量显示
                If d.TotalSize < 1099511627776 Then
                    Console.WriteLine("  Total size of drive:   {0, 15} GB ", FormatNumber(d.TotalSize / 1024 / 1024 / 1024))
                Else
                    Console.WriteLine("  Total size of drive:   {0, 15} TB ", FormatNumber(d.TotalSize / 1024 / 1024 / 1024 / 1024))
                End If

                ' 处理已用空间显示
                Dim usedSpace = d.TotalSize - d.TotalFreeSpace
                If usedSpace < 1099511627776 Then
                    Console.WriteLine("  Total used space:      {0, 15} GB", FormatNumber(usedSpace / 1024 / 1024 / 1024))
                Else
                    Console.WriteLine("  Total used space:      {0, 15} TB", FormatNumber(usedSpace / 1024 / 1024 / 1024 / 1024))
                End If

                ' 处理剩余空间显示
                If d.TotalFreeSpace < 1099511627776 Then
                    Console.WriteLine("  Total available space: {0, 15} GB", FormatNumber(d.TotalFreeSpace / 1024 / 1024 / 1024))
                Else
                    Console.WriteLine("  Total available space: {0, 15} TB", FormatNumber(d.TotalFreeSpace / 1024 / 1024 / 1024 / 1024))
                End If
                Console.WriteLine("")

                ' 添加数据行到DataTable
                Dim drow As DataRow = dt.NewRow
                drow("Date/Time") = DateTime.Now.ToString("yyyy/MM/dd")
                drow("Server") = Dns.GetHostName
                drow("Drive") = d.Name
                drow("TotalSpace") = d.TotalSize
                drow("UsedSpace") = usedSpace
                drow("RemainingSpace") = d.TotalFreeSpace
                drow("Status") = d.IsReady
                dt.Rows.Add(drow)
            End If
        Next

        ' 生成XML文件
        Dim xmlPath = $"c:/temp/ServerDriveInformation_{DateTime.Now.ToString("yyyy MM dd h mm ss tt")}.xml"
        dt.WriteXml(xmlPath)
        Console.WriteLine($"XML文件已生成:{xmlPath}")
    End Sub
End Class

修复说明

  • 提前一次性添加所有DataColumn,避免重复添加导致的异常。
  • 移除冗余的DR1至DR5变量,简化代码结构。
  • 合并遍历逻辑,在同一个循环中完成控制台输出和DataTable数据添加,避免DriveNumber变量的问题。
  • 优化判断逻辑,将d.IsReady的判断提至外层,减少重复判断。

内容的提问来源于stack exchange,提问作者dpresnell90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:57:09