Tìm kiếm File trong folder

Liên hệ QC

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,421
Được thích
4,033
Giới tính
Nam
1/ Xuất phát từ những thành viên đã hỏi trên GPE này 1 số hàm File và Folder có liên Quan tới tên File Or Folder là tiếng việt có dấu

2/ Thông thường thì ta sử dụng Windows thì thấy đa số là sử dụng Scripting.FileSystemObject của Ms
3/ một số khác sử dụng cmd để tìm kiếm file trong Folder duyệt folder đệ quy chạy khá nhanh

4/ vân vân và mây bay .... thì lâu nay Tôi rảnh có viết 1 class + API trên Delphi để sử dụng và ko lệ thuộc vào bên thứ 3 và hổ trợ Unicode path

5/ Xem list Hàm COM như Sau ... để sử dụng COM DLL thì buộc phải đăng ký DLL với Windows mới sử dụng được

1655884246318.png

6/ rất nhiều hàm trong đó 90% là hàm do Delphi viết còn Mạnh chỉ khai báo sử dụng nó thông qua COM DLL theo hình thức A = B

7/ Mạnh có viết 1 Hàm lấy danh sách File trong Folder với tùy chọn lọc File và duyệt Folder đệ quy ... tốc độ khá nhanh úp cho ai cần sử dụng nó

Hàm trên Viết thuần trên Delphi và ko lệ thuộc vào các thư viện của bên thứ 3 VD như cmd Or fso của Ms

8/ Hãy thử test code ... Mạnh Copy 1 hàm cmd của Anh ndu trên GPE này và 1 hàm API do Mạnh viết các bạn thử chọn C:\Windows xong chờ 1 chút có kết quả của 2 Hàm tại Cells A1

Code khai báo API như sau
Mã:
Rem ==========
#If Win64 Then
    Declare PtrSafe Function SelectFolderDialogA Lib "MyLibrary64.dll" () As Variant
    Declare PtrSafe Function GetFilesA Lib "MyLibrary64.dll" _
        (ByVal YourFolder As Variant, ByVal Extension As Variant, ByVal InSub As Boolean) As Variant
#Else
    Declare PtrSafe Function GetFilesA Lib "MyLibrary64.dll" _
        (ByVal YourFolder As Variant, ByVal Extension As Variant, ByVal InSub As Boolean) As Variant
#End If


Rem ----------------------------
Dim FolderPath As Variant
Dim chk As Boolean, aPath  As String
Rem ----------------------------
Rem Tham so Ham GetFilesA
Rem 1/ FolderPath = duong dan Folder can tim kiem File
Rem 2/ Extension = Tuy chon loc theo phan mo rong cua File
Rem 3  InSub = True duyet de quy Folder
Rem 4  InSub = False khong duyet de quy Folder
Rem ----------------------------

Sub Main_GetFiles()
    Dim Res(1 To 1048575, 1 To 1), k As Long
    Dim ListFiles() As String, ObjFile As Variant
    Rem FolderPath = "D:\Database_Server"
    Rem FolderPath = "D:\"
    FolderPath = SelectFolderDialogA()
    Dim t@: t = msTimer
    ''ListFiles = GetFilesA(FolderPath, "*.xls*", True)         ''Chi dinh loc File
    ListFiles = GetFilesA(FolderPath, "", True)                 ''Lay het
    ''ListFiles = GetFilesA(FolderPath, "*.accdb*", true)
   
    ''ActiveSheet.ListBox1.Clear
    For Each ObjFile In ListFiles
        'Debug.Print ObjFile
        'ActiveSheet.ListBox1.AddItem ObjFile
        k = k + 1
        Res(k, 1) = ObjFile
    Next
    ActiveSheet.UsedRange.ClearContents
    ActiveSheet.[A3].Resize(k) = Res
    Rem Debug.Print "Tong so File la " & vbTab & k
    Rem Range("A1").Value = "Tong so File la " & vbTab & k
    Range("A1").Value = msTimer - t
End Sub
 

File đính kèm

  • MyLibrary.rar
    4.5 MB · Đọc: 31
Ngày hôm qua tôi hướng dẫn cách lấy list File = hàm API xong thì hôm nay tôi làm 1 VD nhỏ chỉ dẫn ai đó có nhu cầu sử dụng Class cFso trong DLL như sau

1/ để sử dụng được COM DLL thì trước tiên phải đăng ký sử dụng với Windows ... File đăng ký mọi cái đã úp bài số 1

2/ trong Class cFso đã bao gồm nhiều hàm cơ bản nhất ... thong thả nếu có thời gian tôi sẻ bổ sung thêm nhiều hàm tiện ích khác vào

3/ Khi sử dụng COM nên Từ VBE Tools\ References\Browse...\....MyLibrary64.dll cho thuân tiện khi viết hàm trong Class Chấm (.) là có list của hàm Show ra và chọn nó xong gán các đối số, tham số của hàm vào là xong

4/ đính kèm là 2 DLL 32 bit và 64 bit ( tùy chọn sử dụng theo Office_32bit và Office_64bit)

5/ Code Copy list file sau là sự kết hợp của nhiều hàm trong Class cFso ... còn tùy biến sao thì do người dùng sử dụng và viết nó

Chi tiết code mẫu trong 1 Module

Mã:
Option Explicit
Rem ----------------------------
Rem neu su dung COM phai dang ky MyLibrary64.dll Voi Windows
Rem Tools\ References\Browse...\....MyLibrary64.dll
Dim Fso As New MyLibrary.cFso
Dim FilePath As String
Dim ListFiles() As String, ObjFile As Variant
Rem ----------------------------
Rem Tham so Ham GetFiles Trong COM DLL và cach su dung y trang Ham GetFilesA da xuat API
Rem 1/ FolderPath = duong dan Folder can tim kiem File
Rem 2/ Extension = Tuy chon loc theo phan mo rong cua File
Rem 3  InSub = True duyet de quy Folder
Rem 4  InSub = False khong duyet de quy Folder
Rem ----------------------------
Sub CopyListFile_ToFolder()
    FilePath = "D:\Database_Server"                         ''duong dan Folder can loc Copy File
    Rem ---------- Tuy chon loc File theo huong dan sau
    ListFiles = Fso.GetFiles(FilePath, "*.xls*", True)      ''Chi dinh loc File
    Rem ListFiles = Fso.GetFiles(FilePath, "", True)        ''Lay het tat ca cac File trong Folder
    Rem ListFiles = Fso.GetFiles(FilePath, "*.accdb*", True)
    
    With Fso
        For Each ObjFile In ListFiles
            Debug.Print ObjFile
            Rem .FileCopy ObjFile, "D:\MyFolder\", True         ''cach 1 duong dan Full
            .FileCopy ObjFile, .FixPath("D:\MyFolder"), True    ''cach 2 Fix duong dan
            Rem Khi viet code cham la co list cua ham chi gan vao la xong
        Next
    End With
End Sub
 
Chốt lại chủ đề thớt này tôi tách ra chỉ 3 Hàm API cho ai đó cần tìm kiếm và Copy File sử dụng nó Từ các ứng dụng khác nhau mà ko cần đăng ký sử dụng với Windows .... Với 3 hàm API thôi bạn có thể tùy biến chuyển nó sang Addins hay cái gì đó tùy thích có thể mang theo kèm file Excel hoặc Copy vào System hay ko là tùy ý

Với Hàm tìm kiếm và lọc theo File API này tôi có thể bắt trước keo 1 cái từ liêu siêu gì đó cũng được vvv Nhưng tôi ko làm thế mà Tôi keo đúng với những gì nó có thể làm được Là Hàm tìm kiếm File duyệt folder đệ quy nhanh nhất GPE cho tới thời điểm hiện tại = thế thôi -0-0-0-:::"""><

Xin mời thưởng thức
 

File đính kèm

  • FileSystemAPI.rar
    1.2 MB · Đọc: 35
Lần chỉnh sửa cuối:
Với Hàm tìm kiếm và lọc theo File API này tôi có thể bắt trước keo 1 cái từ liêu siêu gì đó cũng được vvv Nhưng tôi ko làm thế mà Tôi keo đúng với những gì nó có thể làm được Là Hàm tìm kiếm File duyệt folder đệ quy nhanh nhất GPE cho tới thời điểm hiện tại = thế thôi -0-0-0-:::"""><

Xin mời thưởng thức

Mới test xong cái DLL này, đúng là nhanh nhất đến hiện tại đó bạn. Tôi dùng Dir() cũng tốc độ vậy chỉ mỗi tội là không xử lý được đường dẫn qua mạng nội bộ (UNC) và tên trả về tên file tiếng Việt không chính xác.
 
Mới test xong cái DLL này, đúng là nhanh nhất đến hiện tại đó bạn. Tôi dùng Dir() cũng tốc độ vậy chỉ mỗi tội là không xử lý được đường dẫn qua mạng nội bộ (UNC) và tên trả về tên file tiếng Việt không chính xác.
Tôi mới viết lại chút nó nhanh lên 1 chút nói chung là ko đáng kể ...

Có 1 vài cái mà tôi muốn nói đến ai đó đang, đã và sẻ viết Code duyệt Folder + File như sau

Trên này đa số ( chứ ko phải tất cả he ) họ viết xong 1 cái hàm thì họ chỉ test sơ bộ trong 1 Folder x nào đó khoãng vài trăm MB gì đó bao gồm nhiều Folder thấy chạy ra là tốt rồi ... nhưng chưa thật sự tốt đâu mà hạy thử

1/ Tìm kiếm trong C:\Windows

2/ Tìm kiến trong C:\

Với 2 mục trên thôi thì sau 5 giây là thoát rồi .... code trên này còn vài cái hàm cmd của 2 người viết là dùng tạm được cho VBA thôi ... vì code họ viết cho rồi còn ta chỉ copy và sử dụng nên còn dùng được nhưng chạy chậm hơn với code tôi viết ít nhất 3 lần

Nếu ok 2 mục trên thì thử tiếp cho nó chạy 1 dòng For duyệt hết các ổ cứng hiện có trên PC là thấy chất của nó thôi

1/ Tôi mới viết xong 1 Hàm tìm kiếm Folder cũng thế tham số tìm Kiếm là *MyFolder* là nó tìm kiếm ra hết các Folder chạy rất nhanh

2/ Tôi viết tiếp 1 hàm thứ 2 tìm kiếm tất cả các File hiện có trên tất cả các ổ cứng hiện có trên PC mục đích tìm xem ai đó dấu File ở đâu vô tình tôi phát hiện ra nhiều thứ thú vị ....

trong đó khá thú vị chút Code xx viết EXE đóng gói lại khi chạy xả nén ra ... khi thoát xóa hết nó = tính toán rất hay ... code chạy sau 6s là ra thôi

.... thôi tạm tới đó .... :D:D
 
Lần chỉnh sửa cuối:
Nhanh thì quá tốt rồi nhưng nhiều khi chậm một chút mà có kết quả đúng thì cũng tốt chớ sao đâu.
 
Nhanh thì quá tốt rồi nhưng nhiều khi chậm một chút mà có kết quả đúng thì cũng tốt chớ sao đâu.
Nhanh hay chậm không quan trọng lắm đâu bạn ... mà quan trọng là có chạy ra kết quả hay không ... Hãy thử tất cả các hàm hiện có trên GPE này với 3 mục sau theo thứ bậc nếu ra kết quả là tốt lắm lắm rồi

1/ Tìm kiếm File + Folder trong: C:\Windows
2/ Tìm kiếm File + Folder trong: C:\
3/ Tìm kiếm File + Folder trong tất cả các Ổ cứng hiện có trên PC trong 1 sub duy nhất = 1 lần chạy code

Mục số 1 = đơn giản ; 2 = khó chút ; 3 = khó khó hơn chút

Thường nhiều code hiện có trên này ít qua qua được mục số 1 ... chạy sau 5 giây đơ hoặc thoát

............... Tại sao duyệt File + Folder tôi lại cho trên C:\ làm nơi test code = thong thả suy nghĩ he ????????????!!!!!!!!!!!!!!!!!!!!!
 
Web KT
Back
Top Bottom