基于python的 Linux远程文件同步工具
要求
学校程序设计周的题目,值得一提的是老师不准使用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