vb. net поиск в каталоге для файлов, содержащих * .G (num), но НЕ * .GP (num) - PullRequest
0 голосов
/ 28 января 2020

Я довольно знаком с bash, но я очень, *** очень **** новичок в vb. net. Я ищу простой способ найти файлы в папке, заканчивающейся на .G1, .G2, .G3, et c. но НЕ .GP1, .GP2, .GP3 и т. д. c. Затем для каждого файла мне нужно скопировать его в другую папку, используя другое имя файла, но с тем же расширением. Мне удалось выяснить это для уникальных файлов, но в зависимости от проекта их будет неопределенное количество, и мне нужно убедиться, что я получу их все. Жесткое кодирование возможно, но очень, очень уродливо. Какие-либо предложения?

Вот остатки неудачной попытки:

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

1 Ответ

1 голос
/ 28 января 2020

Метод GetFiles поддерживает только подстановочные знаки * и ?.
Таким образом, сначала нужно получить все файлы с расширением *.G*.

В For Each -l oop можно затем использовать Like -оператор для проверки желаемого шаблона:

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
...