有了LINQ後,要濾出我們想要副檔名的檔案,真的蠻簡單的
花了一些時間寫了一個副程式,有需要的朋友可以拿去使用
如果你需要遞迴尋找的話(即該目錄下的所有子目錄也要找),把第3參數帶True進去即可
程式使用方式請看下面
'使用方式(只找1層) Dim files As List(Of FileInfo) = _ GetPathFile(txt_batch_patch.Text, New String() {".png", ".jpg"}) lst_filename.Items.Clear() For Each s As FileInfo In files lst_filename.Items.Add(s.Name) Next '使用方式(遞迴尋找) Dim files As List(Of FileInfo) = _ GetPathFile(txt_batch_patch.Text, New String() {".png", ".jpg"}, True) lst_filename.Items.Clear() For Each s As FileInfo In files lst_filename.Items.Add(s.Name) Next
.
.
完整的副程式如下
''' ''' 取得目錄下副檔名為特定格式的檔案 ''' '''起始目錄 '''要尋找的副檔名 '''是否要尋找子目錄(預設值為不尋找子目錄) ''' List(Of FileInfo) ''' Private Function GetPathFile(ByVal DirPath As String, _ ByVal file_extension As String(), _ Optional ByVal IsRecursive As Boolean = False) _ As List(Of FileInfo) '取得目錄下所有的資料夾 Dim DirectoryPath As New List(Of String) DirectoryPath = My.Computer.FileSystem.GetDirectories(DirPath).ToList Dim Files As New List(Of FileInfo) If IsRecursive = True Then For Each DirName As String In DirectoryPath If System.IO.Directory.Exists(DirName) Then '讓程式不要停止回應 Application.DoEvents() '如果存在下一層的資料夾就遞迴呼叫 Files.AddRange(GetPathFile(DirName, file_extension, IsRecursive)) End If Next End If DirectoryPath.Add(DirPath) For Each DirStr As String In DirectoryPath '取得目錄下所有的檔案名稱(String) Dim myFiles = From s In My.Computer.FileSystem.GetFiles(DirStr) '先把檔案名稱轉成FileInfo Dim f As New List(Of FileInfo) For Each s As String In myFiles f.Add(My.Computer.FileSystem.GetFileInfo(s)) Next '使用LINQ來取出我們要的資料(副檔名包含在ImageExtension()裡面的) Dim files_filter As IEnumerable(Of FileInfo) = _ From s In f _ Where file_extension.Contains(s.Extension.ToLower) Files.AddRange(files_filter.ToList) Next Return Files End Function