【问题标题】:how to search for a string within a specific range of characters within a file name?如何在文件名中的特定字符范围内搜索字符串?
【发布时间】:2023-03-14 14:30:01
【问题描述】:

如何通过DirectoryInfo类在文件名中查找特定范围内的字符串?

我只需要选择字符范围为 22 到 29 的“inscriz”文件

这是我的代码:

Public Sub SpostaFile(sourceDirectory As String, ByVal destDirectory As String)
    Try
        Dim from_date As DateTime = DateTime.Now.AddHours(-24)
        Dim to_date As DateTime = DateTime.Now.AddHours(+24)
        Try
            Dim folder As New DirectoryInfo(sourceDirectory)
            Dim pdfList = folder.EnumerateFiles("*.PDF").Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)
            Dim xlsList = folder.EnumerateFiles("*.XLS").Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)
            Dim xlsxList = folder.EnumerateFiles("*.XLSX").Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)
            Dim csvList = folder.EnumerateFiles("*.csv").Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)
            ' Copy pdf files.
            For Each file In pdfList
                file.CopyTo(Path.Combine(destDirectory, file.Name))
            Next
            ' Copy XLS files.
            For Each file In xlsList
                file.CopyTo(Path.Combine(destDirectory, file.Name))
            Next
            ' Copy XLSX files.
            For Each file In xlsxList
                file.CopyTo(Path.Combine(destDirectory, file.Name))
            Next
            ' Copy CSV files.
            For Each file In csvList
                file.CopyTo(Path.Combine(destDirectory, file.Name))
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

【问题讨论】:

  • 在前面加上 21 怎么样?在所需的字符串之前? ???..??inscriz*.pdf 或正则表达式。
  • 似乎这里的明显路线是Substring,并进行适当的长度检查以确保它至少足够长。

标签: vb.net directoryinfo


【解决方案1】:

转换这个:

Dim pdfList = folder.EnumerateFiles("*.PDF").Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)

到这里:

Dim pdfList = folder.EnumerateFiles("*.PDF").
    Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date AndAlso 
          fi.Name.Length >= 29 AndAlso fi.Name.Substring(22,7) = "inscriz" )

并对其他文件类型执行相同操作。

我将添加一个注释,即问题文本说要在字符 22 和 29 之间的范围内搜索(长度为 7 个字符),以查找也是 7 个字符的文本集。在这种情况下,我们可以做一个简单的相等比较。如果范围更长,我们将改用.Contains()


我也可能很想这样做,以避免重复,但有一个很好的论点可以证明这也太矫枉过正了:

Public Sub SpostaFile(sourceDirectory As String, ByVal destDirectory As String)
    Dim from_date As DateTime = DateTime.Now.AddHours(-24)
    Dim to_date As DateTime = DateTime.Now.AddHours(+24)
    Dim folder As New DirectoryInfo(sourceDirectory)

    Dim cp As Action(Of String) = 
    Sub(fileType) 
        Dim files = folder.EnumerateFiles(fileType).
            Where(Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date AndAlso 
                fi.Name.Length >= 29 AndAlso fi.Name.Substring(22,7) = "inscriz" )

        For Each file In xlsList
            file.CopyTo(Path.Combine(destDirectory, file.Name))
        Next
    End Sub

    Try
        cp("*.PDF")
        cp("*.XLS")
        cp("*.XLSX")
        cp("*.csv")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

【讨论】:

  • 请记住Substring 命令的第一个输入是零索引(因此您希望输入 21,而不是 22)
  • the range between character 22 and 29 ... is 7 characters long 正在讨论中
【解决方案2】:

正则表达式变体:

Dim R as new Regex("^.{21}inscriz")
Dim pdfList = folder.EnumerateFiles("*.PDF").Where(Function(fi) 
    fi.CreationTime >= fromDate AndAlso fi.CreationTime <= to_date AndAlso
    R.Match(fi.Name).Success)

【讨论】:

    【解决方案3】:

    为什么不在文件过滤器中包含这个条件?

    Dim pdfList = folder.EnumerateFiles("??????????????????????inscriz*.PDF") .Where(
        Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date)
    

    通过为重复部分创建一个Sub,可以使代码更具可读性

    Public Sub SpostaFile(sourceDirectory As String, ByVal destDirectory As String)
        Try
            Dim folder As New DirectoryInfo(sourceDirectory)
    
            Dim from_date As DateTime = DateTime.Now.AddHours(-24)
            Dim to_date As DateTime = DateTime.Now.AddHours(+24)
            Dim datePredicate As Func(Of FileInfo, Boolean) =
                Function(fi) fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date
    
            CopyFiles(folder, destDirectory,
                "??????????????????????inscriz*.PDF", datePredicate)
            CopyFiles(folder, destDirectory,
                "??????????????????????inscriz*.XLS", datePredicate)
            CopyFiles(folder, destDirectory,
                "??????????????????????inscriz*.XLSX", datePredicate)
            CopyFiles(folder, destDirectory,
                "??????????????????????inscriz*.csv", datePredicate)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    
    Private Sub CopyFiles(source As DirectoryInfo, destDirectory As String,
                          fileFilter As String,
                          dateFilter As Func(Of FileInfo, Boolean))
    
        Dim fileList = source.EnumerateFiles(fileFilter).Where(dateFilter)
    
        For Each file In fileList
            file.CopyTo(Path.Combine(destDirectory, file.Name))
        Next
    End Sub
    

    【讨论】:

      【解决方案4】:

      使用Substring,并使用可重用谓词简化代码以减少维护

      Public Sub SpostaFile(sourceDirectory As String, ByVal destDirectory As String)
          Try
              Dim from_date As DateTime = DateTime.Now.AddHours(-24)
              Dim to_date As DateTime = DateTime.Now.AddHours(+24)
              Dim searchString = "inscriz"
              Dim folder As New DirectoryInfo(sourceDirectory)
              Dim fileSearchPredicate As Func(Of FileInfo, Boolean) =
                  Function(fi)
                      Return fi.CreationTime >= from_date AndAlso fi.CreationTime <= to_date _
                      AndAlso fi.Name.Length >= 29 AndAlso fi.Name.Substring(21, 8).Contains(searchString)
                  End Function
              Dim pdfList = folder.EnumerateFiles("*.PDF").Where(fileSearchPredicate)
              Dim xlsList = folder.EnumerateFiles("*.XLS").Where(fileSearchPredicate)
              Dim xlsxList = folder.EnumerateFiles("*.XLSX").Where(fileSearchPredicate)
              Dim csvList = folder.EnumerateFiles("*.csv").Where(fileSearchPredicate)
              For Each file In pdfList ' Copy pdf files.
                  file.CopyTo(Path.Combine(destDirectory, file.Name))
              Next
              For Each file In xlsList ' Copy XLS files.
                  file.CopyTo(Path.Combine(destDirectory, file.Name))
              Next
              For Each file In xlsxList ' Copy XLSX files.
                  file.CopyTo(Path.Combine(destDirectory, file.Name))
              Next
              For Each file In csvList ' Copy CSV files.
                  file.CopyTo(Path.Combine(destDirectory, file.Name))
              Next
          Catch ex As Exception
              MessageBox.Show(ex.Message)
          End Try
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 2018-04-23
        • 2018-12-03
        • 1970-01-01
        • 2022-12-18
        • 2022-11-07
        相关资源
        最近更新 更多