Copy thư mục và các file trong thư mục?

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thkd09

Thành viên mới
Tham gia
26/3/09
Bài viết
47
Được thích
2
Giới tính
Nam
Em chào các bác.
Em có một vấn đề như thế này ạ.
Em có 1 thư mục, trong thư mục đó có các file và thư mục con, trong các thư mục con có các file mẫu có thể còn có các thư mục con khác.
Bây giờ em muốn copy tất cả các thư mục con và các file tương ứng trong đó đến một chỗ khác. Nếu chỗ mới đã có các thư mục tương ứng thì copy đè lên các file đã có.
Nó giống như một tiện ích cập nhật ấy ạ. Kính nhờ các bác chỉ giúp em làm với ạ! Em chân thành cảm ơn các bác!
 

File đính kèm

  • New folder.rar
    9.6 KB · Đọc: 4
Em chào các bác.
Em có một vấn đề như thế này ạ.
Em có 1 thư mục, trong thư mục đó có các file và thư mục con, trong các thư mục con có các file mẫu có thể còn có các thư mục con khác.
Bây giờ em muốn copy tất cả các thư mục con và các file tương ứng trong đó đến một chỗ khác. Nếu chỗ mới đã có các thư mục tương ứng thì copy đè lên các file đã có.
Nó giống như một tiện ích cập nhật ấy ạ. Kính nhờ các bác chỉ giúp em làm với ạ! Em chân thành cảm ơn các bác!
Trên diễn đàn có chủ đề này và đã giải quyết xong rồi (có thể không giống hoàn toàn nhưng gần như vậy). Chỉ cần chịu khó tìm và sửa (Nếu cần) để sử dụng thôi bạn.
 
Upvote 0
Em chào các bác.
Em có một vấn đề như thế này ạ.
Em có 1 thư mục, trong thư mục đó có các file và thư mục con, trong các thư mục con có các file mẫu có thể còn có các thư mục con khác.
Bây giờ em muốn copy tất cả các thư mục con và các file tương ứng trong đó đến một chỗ khác. Nếu chỗ mới đã có các thư mục tương ứng thì copy đè lên các file đã có.
Nó giống như một tiện ích cập nhật ấy ạ. Kính nhờ các bác chỉ giúp em làm với ạ! Em chân thành cảm ơn các bác!
Copy toàn bộ à bạn hay chỉ copy theo chọn lọc.Mà toàn bộ File excel hay cả file khác.
 
Upvote 0
copy giữ
Em chào các bác.
Em có một vấn đề như thế này ạ.
Em có 1 thư mục, trong thư mục đó có các file và thư mục con, trong các thư mục con có các file mẫu có thể còn có các thư mục con khác.
Bây giờ em muốn copy tất cả các thư mục con và các file tương ứng trong đó đến một chỗ khác. Nếu chỗ mới đã có các thư mục tương ứng thì copy đè lên các file đã có.
Nó giống như một tiện ích cập nhật ấy ạ. Kính nhờ các bác chỉ giúp em làm với ạ! Em chân thành cảm ơn các bác!
copy giữ nguyên các thư mục con trong thư mục nguồn hay chỉ cần copy các file chứa trong thư mục nguồn bao gồm cả thư mục con chứa bên trong sang thư mục đích vậy bạn
 
Upvote 0
của bạn đây, kiểm tra xem, mình có làm thông báo đã copy bao nhiêu file, bao nhiêu file đã tồn tại và trùng lặp
 

File đính kèm

  • COPY.xlsm
    23.2 KB · Đọc: 11
Upvote 0
Rảnh Tôi vẻ ra cho mà tính xong suy nghĩ xem nên hay ko nên xong tự xử lý lấy

1/ Giả thuyết có nhiều file tên nó giống y trang nhau nhưng cái ruột của nó khác nhau thì sao ????

2/ Copy lưu đè lên vô tình làm hỏng file hoặc mất dữ liệu khi cần tìm lại thì xử lý sao !!!!
 
Upvote 0
của bạn đây, kiểm tra xem, mình có làm thông báo đã copy bao nhiêu file, bao nhiêu file đã tồn tại và trùng lặp
Cảm ơn bác. Cái này đã giải quyết gần hết vấn đề của em đã nêu.
Rảnh Tôi vẻ ra cho mà tính xong suy nghĩ xem nên hay ko nên xong tự xử lý lấy

1/ Giả thuyết có nhiều file tên nó giống y trang nhau nhưng cái ruột của nó khác nhau thì sao ????

2/ Copy lưu đè lên vô tình làm hỏng file hoặc mất dữ liệu khi cần tìm lại thì xử lý sao !!!!
Đúng như bác Kiều Mạnh đã nói. Nếu file đã có nhưng có thay đổi nội dung bên trong thì vẫn không copy. Để em ngâm cứu tiếp trên nền code của bác nguyenvantinnuce.
Cảm ơn các bác rất nhiều!
 
Upvote 0
Có ứng dụng Excel quản lý tập tin, có thể thực hiện những điều bạn muốn, bạn tham khảo thêm bên bài viết.

 
Upvote 0
Cảm ơn bác. Cái này đã giải quyết gần hết vấn đề của em đã nêu.

Đúng như bác Kiều Mạnh đã nói. Nếu file đã có nhưng có thay đổi nội dung bên trong thì vẫn không copy. Để em ngâm cứu tiếp trên nền code của bác nguyenvantinnuce.
Cảm ơn các bác rất nhiều!
đang rảnh tôi gợi ý cho dò và tự học he

1/ Tìm trên GPE này bất cứ code của ai không quan tậm làm gì hãy thử tìm kiếm trong C:\ Windows ... nhanh hay chậm không quan trong lắm nếu chạy ra kết quả thì lưu lại sử dụng hay tham khảo thì tuỳ

còn nếu lỗi thoát thì cũng không cần thiết lưu lại làm gì ... chuyển vào thùng RÁC

2/ trên VBA hãy thử tìm từ khoá SHA1CryptoServiceProvider xem ... trong thư viện của Windows để tính toán giá trị băm cho nội dung tệp + hỏi Em ChatGPT một tí nữa nó lòi ra cả đống xong tư duy logis lại là tự tay viết trên VBA một hàm tạm sử dụng

3/ Nếu biết Delphi thì viết khoãng 10 dòng code là xong .. còn muốn chạy đa luồng cho tìm kiếm folder lớn trên 10 GB thì tầm trên 20 dòng code

và không cần thiết tái sử dụng lại các hàm của Windows làm chi cho nặng ra

4/ khi tìm kiếm file tính toán băm xong nhét nó vào Dictionary trong VBA mà lấy ra file trùng lặp xong muốn xử lý kiểu gì do ta tính tiếp

tạm vậy đi thong thả mà dò và học ... xem ChatGPT nó phán
1724578773295.png
 
Lần chỉnh sửa cuối:
Upvote 0
Có ứng dụng Excel quản lý tập tin, có thể thực hiện những điều bạn muốn, bạn tham khảo thêm bên bài viết.

Cái này em cũng đọc rồi. Mà code cao quá em không hiểu được. Cảm ơn bác ạ!
 
Upvote 0
Em chào các bác.
Em có một vấn đề như thế này ạ.
Em có 1 thư mục, trong thư mục đó có các file và thư mục con, trong các thư mục con có các file mẫu có thể còn có các thư mục con khác.
Bây giờ em muốn copy tất cả các thư mục con và các file tương ứng trong đó đến một chỗ khác. Nếu chỗ mới đã có các thư mục tương ứng thì copy đè lên các file đã có.
Nó giống như một tiện ích cập nhật ấy ạ. Kính nhờ các bác chỉ giúp em làm với ạ! Em chân thành cảm ơn các bác!
đảng rảnh vừa gợi ý cho vừa đưa ra cách nếu ưng thì tôi sẻ hổ trợ cho

1/ trên VBA làm được như các bài trước đó tôi gợi ý ... nhưng làm kiểu mèo ba chân khi thử tải là văng vào thùng RÁC .. tôi mới thử sử dụng trên Windows11 SHA1CryptoServiceProvider thì lỗi vì đó là thư viện .NET của windows còn lỗi tại sao tôi trả cần quan tâm vì không bao giờ sử dụng nó cả

vvv.......... đái ý thế vì xu hướng nếu rảnh tôi loại bỏ hết nhưng gì lệ thuộc vào Windows nếu có thể và khả năng cho phép

2/ Tôi xuất cho 2 hàm API xong từ đó băm vằm mổ sẻ tuỳ chỉnh các kiểu như thế nào là do bạn tự xử lý ... nếu khó khăn khúc nào tôi sẻ hổ trợ

đại ý nó kiểu như Ms xuất cho hai hàm ADODB.Connection và ADODB.Recordset xong các tín đồ ADODB băm vằm mổ sẻ nó ra các kiểu

như vậy vì tôi có su hướng viết API sử dụng chung theo tiêu chuẩn xx khi cần chỉ Call .............

Ví dụ 1 hàm CalculateFilesToHash tính toán giá trị băm cho nội dung tệp để dựa vào đó xác định tệp trùng lặp

Mã:
Declare PtrSafe Function CalculateFilesToHash Lib "ZipFiles64.dll" (ByVal FilePath As Variant) As Variant

Function GetSHA1Hash(FilePath As String) As String
    Dim Hash As Variant
    Hash = CalculateFilesToHash(FilePath)
    If Not IsNull(Hash) Then
        GetSHA1Hash = Hash
    Else
        GetSHA1Hash = "Error calculating hash"
    End If
End Function

Sub CheckDuplicateFiles()
    Dim filePath1 As String
    Dim filePath2 As String
    Dim hash1 As String
    Dim hash2 As String
    
    ' Ðu?ng d?n t?i các t?p
    ''filePath1 = "C:\Database_Server\Data.xlsx"
    
    filePath1 = "C:\Database_Server\TestThu.txt"    '' 1 trung 2
    filePath2 = "C:\Database_Server\TestThu3.txt"   '' 2
    
    ' Tính toán giá tr? bam
    hash1 = GetSHA1Hash(filePath1)
    hash2 = GetSHA1Hash(filePath2)
    
    ' In ra giá tr? bam d? ki?m tra
    Debug.Print "Hash1: " & hash1
    Debug.Print "Hash2: " & hash2
    
    ' So sánh giá tr? bam
    If hash1 = hash2 Then
        Debug.Print "The files are duplicates."
    Else
        Debug.Print "The files are not duplicates."
    End If
End Sub

Ví dụ 2 hàm GetDuplicateFilesAsArray tính toán giá trị băm cho nội dung tệp trong một Folder với tuỳ chọn duyệt đệ quy hay không xong chuyển vào mảng xử lý
Mã:
Declare PtrSafe Function GetDuplicateFilesAsArray Lib "ZipFiles64.dll" _
    (ByRef FolderPath As Variant, ByRef Mask As Variant, _
    ByRef Recursive As Boolean) As Variant
    
Sub Test_FindDuplicateFiles()
    Dim Result As Variant
    Dim FolderPath As String
    Dim Mask As String
    Dim Recursive As Boolean
    Dim i As Long

    'FolderPath = "C:\Your\Folder\Path"
    FolderPath = "C:\Database_Server"
    Rem FolderPath = "C:\Windows"

    ''Mask = "*.txt"
    Mask = "*.*"
    Recursive = True

    ' G?i hàm t? DLL
    Result = GetDuplicateFilesAsArray(FolderPath, Mask, Recursive)

    ' Ghi k?t qu? vào Sheet Excel
    With ThisWorkbook.Sheets("Sheet1")
        .Cells.Clear ' Xóa n?i dung hi?n t?i
        .Range("A1").Value = "FilePath"
        .Range("B1").Value = "FileHash"

        For i = LBound(Result, 1) To UBound(Result, 1)
            .Cells(i + 2, 1).Value = Result(i, 0) ' FilePath
            .Cells(i + 2, 2).Value = Result(i, 1) ' FileHash
        Next i
    End With
End Sub

Khi chạy mã ví dụ 2 sẻ ra như hình sau

1724723044438.png

để ý phần tôi khoanh màu đỏ cột FileHash có các dòng với FilePath nếu nó như nhau tức là file trùng lặp ... xong dựa vào đó xử lý sao là tuỳ

Ví dụ 3 ứng dụng xoá File trùng lặp trong Folder

Mã:
Function GroupFilesByHash(Result As Variant) As Object
    Dim FileDict As Object
    Dim FileCollection As Collection
    Dim FilePath As String
    Dim FileHash As String
    Dim i As Long
    
    ' Create the Dictionary object
    Set FileDict = CreateObject("Scripting.Dictionary")
    
    ' Group files by hash
    For i = LBound(Result, 1) To UBound(Result, 1)
        FilePath = Result(i, 0)
        FileHash = Result(i, 1)
        
        If FileDict.Exists(FileHash) Then
            ' Add file path to the existing collection
            FileDict(FileHash).Add FilePath
        Else
            ' Create a new collection and add the first file path
            Set FileCollection = New Collection
            FileCollection.Add FilePath
            FileDict.Add FileHash, FileCollection
        End If
    Next i
    
    ' Return the dictionary
    Set GroupFilesByHash = FileDict
End Function

Sub TestFindDuplicateFilesWithDeletion()
    Dim Result As Variant
    Dim FolderPath As String
    Dim Mask As String
    Dim Recursive As Boolean
    Dim i As Long, j As Long
    Dim FileDict As Object
    Dim FileCollection As Collection
    Dim Key As Variant
    Dim FilePath As String
    Dim fso As Object
    
    FolderPath = "C:\Database_Server"
    Mask = "*.txt"
    Recursive = False
    
    ' Call the API function from the DLL
    Result = GetDuplicateFilesAsArray(FolderPath, Mask, Recursive)
    
    ' Group the files by their hash using the new function
    Set FileDict = GroupFilesByHash(Result)
    
    ' Create FileSystemObject for file operations
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' Write results to Excel and handle duplicates
    With ThisWorkbook.Sheets("Sheet1")
        .Cells.Clear ' Clear existing content
        .Range("A1").Value = "FilePath"
        .Range("B1").Value = "FileHash"
        
        j = 2
        For Each Key In FileDict.Keys
            Set FileCollection = FileDict(Key)
            
            ' Keep the first file and delete the rest
            For i = 1 To FileCollection.Count
                If i = 1 Then
                    ' Keep the first file
                    .Cells(j, 1).Value = FileCollection(i)
                    .Cells(j, 2).Value = Key
                    j = j + 1
                Else
                    ' Delete the duplicate files Or CopyFiles
                    fso.DeleteFile FileCollection(i), True
                End If
            Next i
        Next Key
    End With
End Sub


để ý dòng fso.DeleteFile FileCollection(i), True là tuỳ chọn xoá File trùng lặp hay copy là do mình tuỳ chọn xử lý theo cách của mình
tạm vậy đi xem ý sao xong tính tiếp ... vì tôi còn lo công việc cái đã còn code két chỉ bất chợt chơi khi rảnh chớp nhoáng viết nhanh vậy
 
Upvote 0
ứng dụng hàm CalculateFilesToHash vào thực tiễn công việc chỉ cần keo Em ChatGPT chút + tư duy logis lại là ta hàm dùng thôi

Mã:
Private Sub FindDuplicateFilesInFolder(ByVal FolderPath As String)
    Dim FileDict As Object
    Set FileDict = CreateObject("Scripting.Dictionary")
   
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets(1) ' Thay d?i n?u c?n thi?t
   
    Dim LastRow As Long
    LastRow = 1 ' B?t d?u ghi k?t qu? t? hàng d?u tiên
   
    ' Ghi tiêu d? c?t
    ws.Cells(LastRow, 1).Value = "Ðuong dan file"
    ws.Cells(LastRow, 2).Value = "Giá tri bam"
    ws.Cells(LastRow, 3).Value = "Trùng lap"
    LastRow = LastRow + 1

    ' T?t c?p nh?t màn hình
    Application.ScreenUpdating = False
   
    ' G?i hàm tìm ki?m file trùng l?p
    Call SearchFolder(FolderPath, FileDict)

    ' T?o m?ng d? luu k?t qu?
    Dim Results() As Variant
    Dim resultCount As Long
    resultCount = 0
   
    ' Xu?t k?t qu? ra m?ng
    Dim FileHash As Variant
    For Each FileHash In FileDict.Keys
        If FileDict(FileHash).Count > 1 Then
            Dim FilePath As Variant
            For Each FilePath In FileDict(FileHash)
                ReDim Preserve Results(1 To 3, 1 To resultCount + 1)
                Results(1, resultCount + 1) = FilePath
                Results(2, resultCount + 1) = FileHash
                Results(3, resultCount + 1) = "Trùng lap"
                resultCount = resultCount + 1
            Next FilePath
        End If
    Next FileHash

    ' Ghi k?t qu? vào sheet
    If resultCount > 0 Then
        ws.Range(ws.Cells(LastRow, 1), ws.Cells(LastRow + resultCount - 1, 3)).Value = Application.Transpose(Results)
    End If
   
    ' B?t l?i c?p nh?t màn hình
    Application.ScreenUpdating = True
   
    Debug.Print "Các file trùng l?p dã du?c ghi vào sheet."
End Sub

Private Sub SearchFolder(ByVal FolderPath As String, ByRef FileDict As Object)
    Dim folder As Object
    Dim subfolder As Object
    Dim file As Object
   
    ' T?o FileSystemObject d? làm vi?c v?i thu m?c và file
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    ' L?p qua các file trong thu m?c hi?n t?i
    For Each file In fso.GetFolder(FolderPath).Files
        Dim FileHash As String
        FileHash = GetSHA1Hash(file.Path)

        ' N?u chua có hash trong dictionary, kh?i t?o m?t Collection m?i
        If Not FileDict.Exists(FileHash) Then
            FileDict.Add FileHash, New Collection
        End If
       
        ' Thêm du?ng d?n file vào danh sách du?ng d?n c?a hash dó
        FileDict(FileHash).Add file.Path
    Next file
   
    ' L?p qua các thu m?c con
    For Each subfolder In fso.GetFolder(FolderPath).SubFolders
        Call SearchFolder(subfolder.Path, FileDict)
    Next subfolder
End Sub

Sub RunDuplicateFileCheck()
    Dim FolderPath As String
    FolderPath = "D:\Database_Server" ' Thay d?i du?ng d?n t?i thu m?c b?n mu?n ki?m tra
    'FolderPath = "D:\Delphi_Example_Library"
    FindDuplicateFilesInFolder FolderPath
End Sub

xem hình
1724728514711.png
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom