【问题标题】:"The given path's format is not supported" on form load,表单加载时“不支持给定路径的格式”,
【发布时间】:2019-06-25 23:21:00
【问题描述】:

我正在申请学校。它有四个按钮,其中一个打开一个日志窗口。它获取每个文件夹中的所有文本文件并将它们显示在 DataGridView 中。所有这些都在域控制器上的映射网络驱动器上。当带有表格的表单加载时,它会抛出“不支持给定路径的格式”。这是我的代码:

Imports System.IO

Public Class Form2
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        dt.Columns.Add("Date/Time")
        dt.Columns.Add("Username")
        dt.Columns.Add("Room")
        For Each dir As String In Directory.GetDirectories("T:\(IncidentReport)\logs")
            Dim infoa As New IO.DirectoryInfo("T:\(IncidentReport)\logs\" + dir)
            Dim infob As IO.FileInfo() = infoa.GetFiles("*.txt")
            Dim infoc As IO.FileInfo
            For Each infoc In infob
                Dim log() As String
                log = File.ReadAllLines("T:\(IncidentReport)\logs\" + dir + "\" + infoc.Name)
                Dim row = dt.NewRow()
                row(0) = log(0)
                row(1) = log(2)
                row(2) = log(1)
                dt.Rows.Add(row)
            Next
        Next
        DataGridView1.DataSource = dt
    End Sub
End Class

有什么想法吗?有点卡在这里...

(我已经尝试将它们更改为我的域用户上的“用户区域”,我可以 100% 控制,但没有区别)

【问题讨论】:

  • 程序无法识别您的 T: 驱动器。尝试将完整的 UNC 路径放入。
  • 我可以尝试,但学校的托管服务部分来自不同的地方,所以我不知道我是否可以得到它。

标签: vb.net


【解决方案1】:

Directory.GetDirectories() 函数返回完整路径字符串:

返回 String[] 全名(包括路径)的数组 指定路径中的子目录,如果没有则为空数组 找到目录。

所以在你的下一行代码中:

Dim infoa As New IO.DirectoryInfo("T:\(IncidentReport)\logs\" + dir)

您将一个完整路径与另一个完整路径连接起来,这显然是行不通的。

我会像下面那样处理它,以避开这类问题。此重新工作会从您的主文件夹中创建一个 DirectoryInfo,然后使用 DirectoryInfo.GetDirectories() 检索子文件夹。从那里,我们通过 DirectoryInfo.GetFiles() 迭代 FileInfo 实例。最后,我们用FileInfo.FullName得到完整的路径文件名:

Dim dt As New DataTable
dt.Columns.Add("Date/Time")
dt.Columns.Add("Username")
dt.Columns.Add("Room")

Try
    Dim folder As New DirectoryInfo("T:\(IncidentReport)\logs")
    For Each subFolder As DirectoryInfo In folder.GetDirectories
        For Each FI As FileInfo In subFolder.GetFiles("*.txt")
            Dim lines() As String = File.ReadAllLines(FI.FullName)
            If lines.Length >= 3 Then
                dt.Rows.Add(New Object() {lines(0), lines(1), lines(2)})
            End If
        Next
    Next
Catch ex As Exception
    MessageBox.Show(ex.ToString, "Error Reading Files")
End Try

DataGridView1.DataSource = dt

【讨论】:

  • 谢谢,我会尽快试试这个:)
【解决方案2】:

我们可以大大扁平化这段代码。此外,永远不要放弃将代码移出即时事件处理程序的机会,或者通过枚举项目而不是将它们全部加载到数组中来节省内存:

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.DataSource = LoadLogFiles("T:\(IncidentReport)\logs")
End Sub

Public Function LoadLogFiles(ByVal basePath As String) As DataTable
    Dim result As new DataTable()
    result.Columns.Add("Date/Time")
    result.Columns.Add("Username")
    result.Columns.Add("Room")

    Dim dir As New DirectoryInfo(basePath)

    For Each fileInfo In dir.EnumerateFiles("*.txt", SearchOption.AllDirectories)
        Dim row = result.NewRow()
        Dim column As Integer = 0  

        'This is better if a log could have many lines and you only care about the first three.
        'If the files only have exactly three lines, just read to an array like you were.    
        For Each line As String In File.ReadLines(fileInfo.Name).Take(3)
           row(column) = line
           column += 1
        Next

        result.Rows.Add(row)
    Next
    Return result
End Sub

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 2012-04-21
    • 1970-01-01
    • 2017-09-14
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多