基于python的 Linux远程文件同步工具

本文介绍了如何使用Python在Windows和Linux环境下实现文件同步工具,包括同步思路、所需库和不同版本的功能实现,如文件复制、删除和Socket传输。在Linux环境下,利用paramiko库遍历远程文件,并通过Socket进行文件传输。
摘要由CSDN通过智能技术生成

要求

学校程序设计周的题目,值得一提的是老师不准使用SFTP传输文件,要求自己手写Socket,不得不说这样大大增加了出错的可能。
题目四:Linux环境下,文件内容同步工具的设计与实现。
要求:
1.分为服务器端与客户端。
2.客户端可以并发与服务器端进行通信。
3.实现客户端之间某个目录内容之间的同步。即,A客户端的目录中添加了文件,则与之同步的客户端的相应目录也自动添加文件,如果删除了文件,则客户端也应该删除。
4.客户端应该有良好的图形化界面。

设计思路

1.由于对Linux系统不熟悉,不可能直接在Linux上开发,应先尝试在Windows系统下实现两个文件夹同步。
2.成功在Windows上实现同步后,思考如何将其移植到Linux上

windows上两个文件夹的同步

思路

参考 https://www.cnblogs.com/geek-arking/p/10213449.html
用 python os库中的函数可以较好的操作文件夹
如 os.lisdir(path) 可以获得路径为path的所有文件名,通过listdir函数,遍历服务端的文件,判断哪些文件服务端有而客户端没有,进行复制操作。
遍历客户端文件,判断哪些文件客户端有而服务端没有,进行删除操作。
在同步过程中,先进行删除操作再进行复制操作最终实现文件同步。

所需的包

import os

第一版本:单纯复制源文件夹中文件至目标文件夹

#第一版本 单纯复制源文件夹到目标文件夹  无法复制多重文件夹 
for filename in os.listdir(path_s):
    filename_s=path_s+os.sep+filename
    print("[*] Source : "+filename_s)
    filename_c=path_c+os.sep+filename
    print("[*] Client : "+filename_c)
    with open(filename_s,'rb') as f_s:
        with open(filename_c,'wb') as f_c:
            f_c.write(f_s.read())

第二版本:实现复制嵌套文件夹

#第二版本实现复制嵌套文件夹
for filename in os.listdir(path_s):
    filename_s=path_s+os.sep+filename
    filename_d=path_d+os.sep+filename
    if os.path.isdir(filename_s):
        if not os.path.exists(filename_d):
            os.mkdir(filename_d)

第三版本:实现已有文件不在复制

主要是通过 os.path.exists()判断中是否存在这个文件,如果有则不再复制

def copy_file(path_s,path_c):
    for filename in os.listdir(path_s):
        filename_s=path_s+os.sep+filename
        filename_c=path_c+os.sep+filename
        if os.path.isdir(filename_s):
            if not os.path.exists(filename_c):
                os.mkdir(filename_c)
            copy_file(filename_s,filename_c)
        else:
            if os.path.exists(filename_c):
                print('[*] Destin:',filename_c,'is already exists' )
            else:
                print('[*] Source :',filename_s)
                print('[*] Destin :',filename_c)
                with open(filename_s,'rb') as f_s:
                    with open(filename_c,'wb') as f_c:
                        f_c.write(f_s.read())
copy_file(path_s,path_c)

第四版本:实现同步删除

遍历客户端文件,判断哪些文件是客户端有而服务端没有的,进行删除操作。

def delete_file(path_s,path_c):
    for filename in os.listdir(path_c):
        filename_c=path_c+os.sep+filename
        filename_s=path_s+os.sep+filename
        if os.path.isdir(filename_c):
            if not os.path.exists(filename_s):
                clear_dir(filename_c)  #删除文件夹前清空
                os.rmdir(filename_c)
            else:
                delete_file(filename_s,filename_c)
        else:
            if os.path.exists(filename_s):
                print('[*] Server :have ',filename_s)
            else:
                os.remove(filename_c)

在这里说明一下由于,非空文件夹是无法删除的,删除前需要清空文件夹

def clear_dir(path):
    for filename in os.listdir(path):
        print(filename)
        filename_in=path+os.sep+filename
        if os.path.isdir(filename_in):
            clear_dir(filename_in)
            os.rmdir(filename_in)
        else:
            os.remove(filename_in)

第五版本:实现Windows下文件同步工具

def SYN(path_s,path_c):
    delete_file(path_s,path_c)
    copy_file(path_s,path_c)
    time.sleep(10)
    

测试
在这里插入图片描述

Linux环境下两个文件夹的同步

思路

通过百度得知有一个库 paramiko 可以实现遍历远程文件夹

 port = 22
 t = paramiko.Transport((ServerAddress, port))
 t.connect(username=UserName, password=Password)
 object = paramiko.SFTPClient.from_transport(t)
 filenames_server=object.listdir(path_s)

其中ServerAddr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值