【问题标题】:vb.net search directory for files containing *.G(num) but NOT *.GP(num)vb.net 在目录中搜索包含 *.G(num) 但不包含 *.GP(num) 的文件
【发布时间】:2020-05-13 10:53:10
【问题描述】:

我对 bash 相当熟悉,但我对 vb.net 非常、非常***。我正在寻找一种简单的方法来查找以 .G1、.G2、.G3 等结尾但不是 .GP1、.GP2、.GP3 等结尾的文件夹中的文件。然后对于每个文件,我需要复制它使用不同的文件名但扩展名相同的另一个文件夹。我已经设法解决了唯一文件的问题,但是根据项目的不同,这些文件的数量会不确定,我需要确保我得到了所有文件。硬编码是可能的,但非常非常难看。有什么建议?

这是失败尝试的残余:

Public Sub FindGFiles()
   FileList = IO.Directory.GetFiles(searchDir, ".G[1-99]" + , IO.SearchOption.AllDirectories)
   For Each foundfile As String In FileList
        If foundfile.Contains(".G#") Then
            'copy file somehow and retain file extension
        Else
            MsgBox("No match")
        End If
    Next
End Sub

【问题讨论】:

    标签: vb.net search copy rename


    【解决方案1】:

    GetFiles-方法只支持*? 通配符。
    所以你必须先获取所有带有*.G*-extension 的文件。

    For Each-loop 中,可以使用Like-operator 来检查所需的模式:

    Public Sub CopyGFiles(searchDir As String, destDir As String)
        Dim fileList As String() = IO.Directory.GetFiles(searchDir, "*.G*", IO.SearchOption.AllDirectories)
        Dim fileName As String
        Dim extension As String
    
        For Each foundfile As String In fileList
            fileName = IO.Path.GetFileNameWithoutExtension(foundfile)
            extension = IO.Path.GetExtension(foundfile)
    
            If extension Like ".G#" OrElse
               extension Like ".G##" Then
                'copy file to destination, append "_new" to the filename and retain file extension
                IO.File.Copy(foundfile, IO.Path.Combine(destDir, fileName & "_new" & extension))
            Else
                'pattern not matched
            End If
        Next
    End Sub
    

    方法调用如下:

    CopyGFiles("C:\Temp", "C:\Temp\Dest")
    

    这应该在Try/Catch 中完成,因为在处理文件时可能会发生不同的异常。

    Try
        CopyGFiles("C:\Temp", "C:\Temp\Dest")
    Catch ex As Exception
        MessageBox.Show("An error occured" + vbCrLf + ex.Message)
    End Try
    

    【讨论】:

    • 你也可以使用类似:dim rgx = new Regex("G[0-9]") dim files = Directory.GetFiles(dir, "*.G*", SearchOption.AllDirectories).Where(Function(f) rgx.IsMatch(Path.GetExtension(f))).toList()。带有指定是否使用RegexOptions.IgnoreCase的选项。
    • 非常感谢!我知道我自己已经接近正确答案,但我的方法仍然存在严重缺陷。
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多