Getfile с несколькими фильтрами расширения и порядок по имени файла

Nimisha Prajapati спросил: 28 апреля 2018 в 08:24 в: vb.net

Я работаю над настольным приложением vb.net. Теперь мне нужны файлы, поступающие из каталога, с расширением .txt и .sql, а также файлы, поступающие по порядку по имени папки. в необходимости обоих вместе, как это сделать?

  Try
                Dim s As String = Txtfolder.Text                Dim files As List(Of String) = New List(Of String)()
                Try
                  For Each f As String In Directory.GetFiles(s, "*.*").Where(Function(f1) f1.EndsWith(".sql") OrElse f1.EndsWith(".txt")).OrderBy(Function(f) f.LastWriteTime).First()
                        files.Add(f)
                    Next                    For Each d As String In Directory.GetDirectories(s)
                        files.AddRange(DirSearch(d))
                    Next
                Catch excpt As System.Exception
                    MessageBox.Show(excpt.Message)
                End Try  Private Function DirSearch(ByVal sDir As String) As List(Of String)
        Dim files As List(Of String) = New List(Of String)()
        Try
            For Each f As String In Directory.GetFiles(sDir, "*.*").Where(Function(f1) f1.EndsWith(".sql") OrElse f1.EndsWith(".txt"))
                files.Add(f)
            Next            For Each d As String In Directory.GetDirectories(sDir)
                files.AddRange(DirSearch(d))
            Next
        Catch excpt As System.Exception
            MessageBox.Show(excpt.Message)
        End Try        Return files
    End Function

2 ответа

Есть решение
jmcilhinney ответил: 28 апреля 2018 в 11:23

Вот пример варианта 1 из моего комментария, т. е. получить все пути к файлу и фильтровать себя:

Dim folderPath = "folder path here"
Dim filePaths = Directory.GetFiles(folderPath).
                          Where(Function(s) {".txt", ".sql"}.Contains(Path.GetExtension(s))).
                          OrderBy(Function(s) Path.GetFileName(s)).
                          ToArray()

Вот пример варианта 2, т. е. получить пути по расширению и объединить:

Dim folderPath = "folder path here"
Dim filePaths = Directory.GetFiles(folderPath, "*.txt").
                          Concat(Directory.GetFiles(folderPath, "*.sql")).
                          OrderBy(Function(s) Path.GetFileName(s)).
                          ToArray()
Nimisha Prajapati ответил: 28 апреля 2018 в 11:34
спасибо за ваш ответ. Работает.
Jimi ответил: 28 апреля 2018 в 12:44

Альтернативный метод, который позволяет искать несколько каталогов и фильтровать результаты с использованием нескольких шаблонов поиска.
Он возвращает упорядоченный List(Of String):

Private Function DirSearch(ByVal sDirList As String(), SearchPatter As String()) As List(Of String)
    Return sDirList.SelectMany(
        Function(dir) SearchPatter.SelectMany(
            Function(filter)
                Return Directory.GetFiles(dir, filter, SearchOption.AllDirectories)
            End Function).OrderBy(Function(xDir) xDir)).ToList()
End Function

Вы можете передать методу список путей и список расширений:

Dim SearchPaths As String() = New String() {"[Directory1]", "[Directory2]"}
Dim ItemSearchPattern As String() = New String() {"*.txt", "*.sql", "*.jpg"}Dim DirListing As List(Of String) = DirSearch(SearchPaths, ItemSearchPattern)

Извлечь содержимое каталога sigle с помощью:

p>
Dim FilesInDir As List(Of String) = DirListing.
                  Where(Function(entry) entry.ToUpper().
                  Contains("[DirectoryName]".ToUpper())).ToList()

Это нечувствительный к регистру фильтр. Удалите (ToUpper()) для чувствительного к регистру.