Tìm kiếm và xóa File trùng lặp 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
Rảnh tôi viết 1 Tools quản lý các File Ảnh làm hồ sơ của Tôi và xóa các File trùng lặp trong Folder không bao gồm các Folder con trong Folder cha

1/ Úp cho ai thích thì dùng ... nếu có mong muốn điều chỉnh gì thêm cứ nêu trong khả năng điều chỉnh và phù hợp tôi sẻ viết lại

2/ sau khi thử nghiệm 1 thời gian nếu ổn định sẽ xuất hàm API và thêm vào Add-Ins cho 1 Button mới

Cơ chế hoạt động như sau

1/ duyệt tìm kiếm folder đệ quy hay không đệ quy folder ( Tích chọn )

2/ xóa file tìm kiếm trong folder theo mục số 1 ( Tích chọn )

3/ VD: có 1 Folder là: D:\11\22\33\44\55\

trong mỗi folder có 10 file trùng lặp thì tổng số file là 50 file thì khi duyệt đệ quy folder nó sẻ xóa trong mỗi folder là 9 file

còn lại 1 file trong folder lưu làm mẫu khi cần thiết còn gợi nhớ lại cho ta biết gì cái file trong mỗi folder đó


4/ khi tìm kiếm không chọn xóa file trùng lặp thì sau khi tìm kiếm xong nó sẻ xuất các file trùng lặp ra file Text và .log lỗi trong trong quá trình tìm kiếm trong Folder Exe

5/ Tất cả các file trùng lặp được xóa vào thùng Rác nếu cần ta có thể khôi phục lại nó

6/ Hình ảnh khi tìm kiếm file trùng lặp trong Folder

1.PNG

7/ Tạm dừng và chạy tiếp tục tìm kiếm phím tắt là: Esc ..

khi tạm dừng tại thời điểm đang tìm kiếm hình sau
2.PNG

Úp phía dưới là 1 Exe chỉ cần Copy và sử dụng
 

File đính kèm

  • FindDuplicateFiles.rar
    911.3 KB · Đọc: 20
Lần chỉnh sửa cuối:
ngày hôm qua tới này có 15 lượt tải mà không thấy ai có ý kiến chi he ... ổn mọi cái xuất Hàm API và cho vào AddIns sử dụng chung cho bộ Office
 
Cơ bản là đang tìm phần mềm nhân bản file lên 1000 lần bác ơi.
viếết code copy file xong thêm cái tên mới thôi

VD: file gốc là Myfile.xlsb thì file mới là Myfile_1.xlsb,Myfile_2.xlsb ..+++++++++++ lên Myfile_1000.xlsb

VBA thừa viết ra . nếu biết sử dụng hàm API của Ms thì viết còn không thì Fso đi cho lành

Biết thêm 1 ngôn ngữ hiện đại khác ngoài VBA ra viết sướng lắm vì nó có các thự viện dựng sẳn còn ta chỉ có call và lắp ghép lại

File bài số 1 cơ bản có 2 hàm thôi sử dụng thự viện có sẳn của Delphi
 
Lần chỉnh sửa cuối:
Sau khi xong nó vẫn báo running và X thì treo bác nhé.
 

File đính kèm

  • 1689223377387.png
    1689223377387.png
    357.1 KB · Đọc: 21
Sau khi xong nó vẫn báo running và X thì treo bác nhé.
Tại tiến trình nó duyệt File chưa xong .... xong kích chuột liên tục lên Form thì bị vậy thôi

Tôi khóa lại cho nó chạy trong 1 luồng riêng biệt là hết thôi. nhưng vẫn để vậy xem sao xong tính tiếp

Với lại lỗi đó để IM vậy sau chút thời gian là nó cũng tự thoát hoặc nó tìm đến file lớn

khi duyệt File có thuộc tính
Access is denied cũng báo vậy sau vài giây tự thoát chạy tiếp
 
thử copy các file Ảnh xong nhân bản nó ra nhiều file với tên khác nhau trong nhiều Folder xem nó chạy có chính xác không ???

có nhưng file ảnh nếu nhìn mắt thường không phát hiện ra khác nhau nhưng file bài số 1 nó nhận ra trùng lặp đấy ??!!

hay file Text trắng tinh với file Text ghi 1 cái dấu chấm "." và nó cũng nhận ra tôi thử vài thứ thấy OK

Còn ngoại lệ khác thì chưa biết
 
thử copy các file Ảnh xong nhân bản nó ra nhiều file với tên khác nhau trong nhiều Folder xem nó chạy có chính xác không ???

có nhưng file ảnh nếu nhìn mắt thường không phát hiện ra khác nhau nhưng file bài số 1 nó nhận ra trùng lặp đấy ??!!

hay file Text trắng tinh với file Text ghi 1 cái dấu chấm "." và nó cũng nhận ra tôi thử vài thứ thấy OK

Còn ngoại lệ khác thì chưa biết
ảnh thì không bị lỗi nhé bác, xong vẫn hiện running nhưng tắt được.
 
Ăn theo phong trào biết thêm một ngôn ngữ hiện đại khác...
Dùng thư viện có sẵn của Python, chỉ vài dòng code, có tuỳ chọn chỉ duyệt các file theo đuôi (extension) chỉ định cho nhanh.
Cơ chế là dùng MD5 Checksum để tìm file trùng lặp.
Các bạn có thể kiểm tra xem file giống không bằng trang web này: https://emn178.github.io/online-tools/md5_checksum.html
(chỉ là copy trên mạng :cool:)

Python:
# delete_duplicate_file.py

"""
Duyet folder và subfolder, dùng md5 checcksum để xác định file trùng và xoá nó.
"""

import os
import hashlib
from collections import defaultdict
#import csv
import time

# import tkinter as tk
# from tkinter import filedialog
# root = tk.Tk()
# root.withdraw()
# src_folder = filedialog.askdirectory()

start = time.time()

src_folder = "/Users/ongke0711/Pictures" # Thay thế đường dẫn tới Folder

def generate_md5(fname, chunk_size=1024):
    hash = hashlib.md5()
    with open(fname, "rb") as f:
        # Read the 1st block of the file
        chunk = f.read(chunk_size)
        # Keep reading the file until the end and update hash
        while chunk:
            hash.update(chunk)
            chunk = f.read(chunk_size)

    # Return the hex checksum
    return hash.hexdigest()

if __name__ == "__main__":
    """
    Starting block of script
    """

    # The dict will have a list as values
    md5_dict = defaultdict(list)

    file_types_inscope = ["ppt", "pptx", "pdf", "txt", "html",
                          "mp4", "jpg", "png", "xls", "xlsx", "xml",
                          "vsd", "py", "json", "bmp", "psd"]

    # Walk through all files and folders within directory
    for path, dirs, files in os.walk(src_folder):
        print("Analyzing {}".format(path))
        for each_file in files:
            if each_file.split(".")[-1].lower() in file_types_inscope:
                # The path variable gets updated for each subfolder
                file_path = os.path.join(os.path.abspath(path), each_file)
                # If there are more files with same checksum append to list
                md5_dict[generate_md5(file_path)].append(file_path)

    for key, val in md5_dict.items():
        first = True
        for file in val:
            if first:
                first = False
            else:
                os.remove(file)

    end = time.time()
 
    print("Xong trong "+ str(end - start) + "s")
 
ảnh thì không bị lỗi nhé bác, xong vẫn hiện running nhưng tắt được.
Nguyên lý nó hoạt động như sau

1/ khi chọn Folder nó sẽ duyệt qua các file trong folder tính toán và tải nó vào bộ nhớ đệm trên PC

2/ xong mục số 1 thì nó tính toán xem file có trùng lặp hay không

3/ khi nó đang chạy mà kích chuột liên tục lên form làm cho tiến trình nó tính toán khác đi thì bị ( Not Responding ) sau khoãng vài giây chi đó tự thoát chạy tiếp

4/ khi đang chạy mà tạm dừng với phím tắt Esc trên tiêu đề báo là 'Tạm dừng tìm kiếm...' nhưng thực tế trong bộ nhớ đệm nó tải trước đó vẫn còn nhiều file đã duyệt nên nó sẽ dừng hẳn sau vài giây sau đó

5/ mọi vấn đề phát sinh trên không quan trọng lắm tôi khóa lại khi đang chạy lại xong thôi ... cái quan trọng là có chạy đúng kết quả hay không và hãy thử

C:\ Windows xem có chạy hay không ... trên máy tôi chạy tốt khi chạy tôi không thao tác gì trên Form nữa mà để yên vậy cho tới khi nó kết thúc


6/ Viết code duyệt File và Folder quan trọng nhất thử tải là C:\Windows nếu không văng ra là dùng được -0-0-0--.,\; còn nói nhanh hay siêu nhanh mà văng ra xem bỏ đi

Ăn theo phong trào biết thêm một ngôn ngữ hiện đại khác...
Dùng thư viện có sẵn của Python, chỉ vài dòng code, có tuỳ chọn chỉ duyệt các file theo đuôi (extension) chỉ định cho nhanh.
Cơ chế là dùng MD5 Checksum để tìm file trùng lặp.
Các bạn có thể kiểm tra xem file giống không bằng trang web này: https://emn178.github.io/online-tools/md5_checksum.html
(chỉ là copy trên mạng :cool:)

Python:
# delete_duplicate_file.py

"""
Duyet folder và subfolder, dùng md5 checcksum để xác định file trùng và xoá nó.
"""

import os
import hashlib
from collections import defaultdict
#import csv
import time

# import tkinter as tk
# from tkinter import filedialog
# root = tk.Tk()
# root.withdraw()
# src_folder = filedialog.askdirectory()

start = time.time()

src_folder = "/Users/ongke0711/Pictures" # Thay thế đường dẫn tới Folder

def generate_md5(fname, chunk_size=1024):
    hash = hashlib.md5()
    with open(fname, "rb") as f:
        # Read the 1st block of the file
        chunk = f.read(chunk_size)
        # Keep reading the file until the end and update hash
        while chunk:
            hash.update(chunk)
            chunk = f.read(chunk_size)

    # Return the hex checksum
    return hash.hexdigest()

if __name__ == "__main__":
    """
    Starting block of script
    """

    # The dict will have a list as values
    md5_dict = defaultdict(list)

    file_types_inscope = ["ppt", "pptx", "pdf", "txt", "html",
                          "mp4", "jpg", "png", "xls", "xlsx", "xml",
                          "vsd", "py", "json", "bmp", "psd"]

    # Walk through all files and folders within directory
    for path, dirs, files in os.walk(src_folder):
        print("Analyzing {}".format(path))
        for each_file in files:
            if each_file.split(".")[-1].lower() in file_types_inscope:
                # The path variable gets updated for each subfolder
                file_path = os.path.join(os.path.abspath(path), each_file)
                # If there are more files with same checksum append to list
                md5_dict[generate_md5(file_path)].append(file_path)

    for key, val in md5_dict.items():
        first = True
        for file in val:
            if first:
                first = False
            else:
                os.remove(file)

    end = time.time()
 
    print("Xong trong "+ str(end - start) + "s")
đó là của người ta ... Bạn viết Exe = py úp lên thử chơi cho vui
 
Lần chỉnh sửa cuối:
đó là của người ta ... Bạn viết Exe = py úp lên thử chơi cho vui

Bày nguyên cái source code và nguyên tắc xử lý là được rồi, còn lại thì ai thích dùng công cụ (ngôn ngữ) gì để viết thì viết thôi. Dùng VSCode chạy nó cũng biết như thế nào rồi, exe làm gì đối với dân lập trình trình cao như bạn. Các thư viện Python có sẵn, chỉ có call và lắp ghép lại thì có gì mà của người ta với của mình chứ... người ta public đầy ra đấy...
Giờ chỉ cần kiếm được nguồn dữ liệu nào để test xem có bị treo máy hay không thôi.
 
Bày nguyên cái source code và nguyên tắc xử lý là được rồi, còn lại thì ai thích dùng công cụ (ngôn ngữ) gì để viết thì viết thôi. Dùng VSCode chạy nó cũng biết như thế nào rồi, exe làm gì đối với dân lập trình trình cao như bạn. Các thư viện Python có sẵn, chỉ có call và lắp ghép lại thì có gì mà của người ta với của mình chứ... người ta public đầy ra đấy...
Giờ chỉ cần kiếm được nguồn dữ liệu nào để test xem có bị treo máy hay không thôi.
Trên C#, Python , Delphi hay bất cứ ngôn ngữ lập trình hiện đại nào nó sẽ có các thư viện dựng sẳn còn ta có biết lắp ghép mà sử dụng hay không là chuyện khác

Hay trên VBA cũng vậy cái ADODB có 2 món chính đó là CreateObject("ADODB.Connection") CreateObject("ADODB.Recordset")
nó có mấy chục năm rồi mà có người dùng nó viết ra đầy thứ có người không biết làm gì là chuyện khác

chủ đề thớt này bàn theo tiêu đề của nó ... lý thuyết xa vời xem ra không phù hợp và khuyến khích ta bàn luận ở đây .. nếu có thì à ơi chút cho vui

còn trên Google thì nguồn phơi bày ra bao la ... còn ta có biết vận dụng nó hay không cũng là chuyện khác


Ai lạc đề vui lòng không bàn luận dài dòng ở đây. ta lặp chuyên đề mới mà bàn xa xôi dài dòng chi đó chăng
 
Các bạn khi dùng ứng dụng này tìm xoá file trùng lặp thì hãy cẩn thận khi dùng với C:\Windows nhé. Lỡ có chuyện gì đó bất thường, chưa tính tới xảy ra, nó xoá một vài file hệ thống nào đó trong Windows thì chết toi...ai mà biết được.

Hình này là test trên máy ảo Windows 11 (tức là tài nguyên hệ thống đã bị chia sẻ bớt nữa cho máy ảo), C:\Windows dung lượng 16G
Screenshot at Jul 13 17-17-44.png
 
Lần chỉnh sửa cuối:
Các bạn khi dùng ứng dụng này tìm xoá file trùng lặp thì hãy cẩn thận khi dùng với C:\Windows nhé. Lỡ có chuyện gì đó bất thường, chưa tính tới xảy ra, nó xoá một vài file hệ thống nào đó trong Windows thì chết toi...ai mà biết được.

Hình này là test trên máy ảo Windows 11 (tức là tài nguyên hệ thống đã bị chia sẻ bớt nữa cho máy ảo), C:\Windows dung lượng 16G
View attachment 292748
1/ Cái đó không phải File bài số 1 của tôi nha ... đừng có nói mập mờ kiểu đó ... nhiều khi ai đó hiểu lầm xong a dua theo nói bậy

2/ Khi test code C:\Windows thì chỉ chạy code còn không ai dại gì cho nó xóa File trùng lặp

3/ khi code xử lý tốt thì duyệt File và Folder trong Windows sẽ chạy tốt và không bị văng ra

4/ thay vì xóa file trực tiếp thì viết thêm 1 hàm xóa nó vào thùng RAC! là xong
 
Lần chỉnh sửa cuối:
Phiên bản thứ 2 úp phía dưới mọi cái như bản file bài số 1 và các mô tả phát sinh các bài trước đó vẫn như vậy không thay đổi

file úp phía dưới chỉ thay hàm xóa file trực tiếp ( bỏ )

thì xóa file trùng lặp chuyển vào thùng RÁC cho ta xem lại nếu cần thì khôi phục lại nó

vậy đi cho yên tâm không rồi ai đó đầu óc hạt đậu nành suy diễn tào lao mệt lắm :p:D:D:D

Mới cập nhật bản mới xóa file bài này úp lại file bài số 1
 
Lần chỉnh sửa cuối:
Mới cập nhật mới úp lại file bài số 1 và xóa file bài số 15 vì không cần thiết

1/ Thêm xử lý luồng chạy nhanh hơn đang kể

2/ xử lý sự kiện khi chạy thao tác bấm trên Form làm ( Not Responding ) như mô tả các loạt bài trước

3/ xóa File trùng lặp vào thùng RÁC nếu cần khôi phục lại

4/ Thêm Phím tắt Esc tạm dừng tìm kiếm bất cứ thời điểm nào của quá trình tìm kiếm chưa kết thúc

5/ Tiếp tục tìm kiếm khi mục số 4 tạm dừng

6/ khóa button khi tìm kiếm và khôi phục lại chính nó


Rảnh Tôi sẽ viết các ứng dụng cơ bản nhất gom nó vào 1 AddIns duy nhất
sử dụng chụng cho cả bộ Office để sử dụng chung khi cần


Mới cho file bài số 1 vào và gộp file CSV vào tiếp theo sau đó xong ++++++++++++++++++ nhiều thứ khác nữa

Hình ảnh sử dụng cho Access , Excel, Word, Outlook,PowerPoint

1689504994100.png


Thong thả ôm cây và chờ thỏ ... Nếu gió lên thì thuyền ta ra khơi thôi :p:D;)
 
Lần chỉnh sửa cuối:
đã chuyển thành Add-Ins sử dụng chung cho Access , Excel, Word, Outlook,PowerPoint
sử dụng ngay trong TaskPane


1/ Tìm kiếm File với tùy chọn duyệt đệ quy Folder

2/ SyncFile đồng bộ file từ Folder To Folder

3/ FilesMove là di chuyển file từ Folder To Folder

4/ Duplicate Files là tìm kiếm và xóa File trùng Lặp trong Folder

... thong thả thêm vào tiếp

1690773201712.png


Delphi viết AddIns quá đơn giản và tốt
 
Web KT
Back
Top Bottom