使用Python实现两个文件夹的全量同步(同步增、改、删)

文章目录

1. 按

要想同步两个文件夹中的数据,基本思路首先需要遍历源文件夹中的信息,将源文件夹中的文件复制到目标文件夹,然后再将目标文件夹中有的文件而源文件夹中没有的文件予以删除。
复制文件时使用了操作系统封装好的xcopy命令,因此只需一行代码即可,删除资源是我自己写的。

  • 关于xcopy:
    有时我们会碰到这种情况,一些文件我们已经修改过、网上面又有最新版本的。原来备份的那份文件我们要及时更新的时候。那怎么才能同步更新呢?当然我们可以把最新的文件复制过去,这也是一种解决办法。
    但如果修改的文件有很多,自己也记不清楚哪些文件是更新过的。当有很多文件需要更新时,都要复制过去,这可不是件省力气的活,而且还容易出错,比如一些文件被忘记更新!
    这时,我们可以通过xcopy来完成,在命令提示符中输入并运行xcopy e:\*.* d: /s /h /d /y就可以了!
    更多关于xcopy,请在命令提示符中运行xcopy /?或者查看百度百科:https://baike.baidu.com/item/xcopy
  • 关于删除资源
    xcopy只能实现的同步,但对于的同步,则没有实现。当源文件夹下的文件夹或者文件被删除时,我们也是需要此删除操作同步至目标文件夹下的。即xcopy只能实现增量同步,如果需要实现全量同步,则需要我们自己再写一个同步删除的功能。
  • 关于实时监控:https://blog.csdn.net/COCO56/article/details/101827523

2. 代码

# -*- coding: UTF-8 -*-

import os
import shutil

src=r'G:\\OneDrive - Office Everyday\\视频教程'
des=r'X:\\视频教程'

def copyRes(src, des):
    cmd = 'xcopy "' + src +'" \"' + des + '" /s /h /D /y'
    os.system(cmd)

print('正在复制资源')
copyRes(src, des)
print('复制完毕')

cnt=0
def delRes(path):
    path2 = path.replace(des, src)
    if os.path.exists(path2):
        return 
    if os.path.isdir(path):
        shutil.rmtree(path)
    else:
        os.remove(path)
    global cnt
    cnt+=1
    print(cnt, path)

print('正在删除资源')
for root, dirs, files in os.walk(des,topdown=True):
    for dir in dirs:
        delRes(os.path.join(root, dir))
    for file in files:
        delRes(os.path.join(root, file))
print('删除完毕')

3. 实际应用

  • 打包命令
    pyinstaller -F -c 同步文件夹.py --distpath .
    
  • 程序源码
    # -*- coding: UTF-8 -*-
    
    import os
    import shutil
    import time
    
    def copyRes(src, des):
        cmd = 'xcopy "' + src +'" \"' + des + '" /s /h /D /y'
        os.system(cmd)
    
    cnt=0
    def delRes(path, des, src):
        path2 = path.replace(des, src)
        if os.path.exists(path2):
            return
        if os.path.isdir(path):
            shutil.rmtree(path)
        else:
            os.remove(path)
        global cnt
        cnt+=1
        print(cnt, path)
    
    def updateRes(src, des):
        global cnt
        cnt=0
        print('正在从【',src,'】同步至【', des,'】',sep='')
        print('正在复制资源')
        copyRes(src, des)
        print('复制完毕')
    
        print('正在删除资源')
        for root, dirs, files in os.walk(des,topdown=True):
            for dir in dirs:
                delRes(os.path.join(root, dir), des, src)
            for file in files:
                delRes(os.path.join(root, file), des, src)
        print('删除完毕')
    
    def run(li):
        while True:
            for i in li: updateRes(i[0], i[1])
            for i in range(60*30, 0, -1):
                print("距离下一轮更新还剩:", i, "秒。", end="", sep="")
                time.sleep(1)
                print("\r", end="", flush = True)
    
    if __name__ == "__main__":
        li=[
            (r'G:\OneDrive - Office Everyday\大型软件', r'X:\大型软件'),
            (r'G:\OneDrive - Office Everyday\精品软件', r'W:\精品软件'),
            (r'G:\OneDrive - Office Everyday\开发相关', r'V:\开发相关'),
            (r'G:\OneDrive - Office Everyday\视频教程', r'U:\视频教程'),
            (r'G:\OneDrive - Office Everyday\视频教程', r'Y:\视频教程'),
            (r'G:\OneDrive - Office Everyday\稀缺资源', r'V:\稀缺资源'),
            (r'E:\OneDrive - 微信公众号奇乐帮\考研视频', r'Z:\考研视频'),
        ]
        
        run(li)
    
    原文作者:COCO56(徐可可)
    原文地址: https://blog.csdn.net/COCO56/article/details/101822001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞