def rm(self, arg): ''' 删除文件或目录 :param arg: :return: ''' point = { 'action': arg[0], 'file': arg[1], 'user': self.isLogin, } self.conn.send(json.dumps(point).encode()) #发送指针到服务端 server_ack = self.conn.recv(1024).decode() common.code_parsing(server_ack)
def mkdir(self, arg): ''' 创建目录的方法 :param arg: 目录路径 :return: ''' path = self.__cover_path(arg[1]) point = { 'action': arg[0], 'path': path, 'user': self.isLogin, } self.conn.send(json.dumps(point).encode()) #发送文件指针 server_ack = self.conn.recv(1024).decode() common.code_parsing(server_ack)
def cd(self, arg): ''' 切换目录方法 :param arg: 切换的路径 :return: ''' path = self.__cover_path(arg[1]) point = { 'action': arg[0], 'target_path': path, 'user': self.isLogin, } self.conn.send(json.dumps(point).encode()) server_ack = self.conn.recv(1024).decode() if server_ack == '203': self.current_path = path else: common.code_parsing(server_ack)
def __login(self): ''' 登录 :return: ''' while True: res = self.conn.recv(1024).decode() print(res) user = input(">>user: "******">>password: "******"400": self.isLogin = user self.conn.send('300'.encode()) common.code_parsing(server_ack) break else: common.code_parsing(server_ack) self.conn.send('403'.encode())
def mv(self, arg): ''' 客户端移动文件或者修改文件名的方法 :param arg: :return: ''' if len(arg) == 3: source = self.__cover_path(arg[1]) #源地址 target = self.__cover_path(arg[2]) #目标地址 point = { 'action': arg[0], 'source': source, 'target': target, 'user': self.isLogin, } self.conn.send(json.dumps(point).encode()) # 发送文件指针 server_ack = self.conn.recv(1024).decode() common.code_parsing(server_ack) else: print("缺少必须参数")
def put(self, arg): ''' 上传文件 :param arg: 要上传的文件 :return: ''' local_file = arg[1] #要上传的文件(绝对路径) file_target_path = arg[2] #上传到服务端的路径,默认为当前目录 if os.path.exists(local_file): #判断文件是否存在 filename = os.path.basename(local_file) filesize = os.stat(local_file).st_size md5 = common.md5sum(local_file) point = { 'action': arg[0], 'filename': filename, 'filesize': filesize, 'md5': md5, 'target_path': file_target_path, 'user': self.isLogin, } self.conn.send( bytes(json.dumps(point), encoding="utf-8")) #发送文件指针信息,包括动作,文件名,目标路径,文件大小,md5等 server_ack = self.conn.recv(1024).decode() #接收服务器状态 code = server_ack.split('|')[0] if code == '211': #选择是否断点续传 common.code_parsing(server_ack) while True: res = input('请选择:') if res in ('y', 'n'): self.conn.send(res.encode()) server_ack = self.conn.recv(1024).decode() # 接收服务器状态 if server_ack.split('|')[0] == "200": # 服务器已经准备好接收数据 start_send_size = int(server_ack.split('|')[1]) break else: common.code_parsing(server_ack) return None #服务端异常,中断上传 else: print("输入错误,请输入y和n") elif code == "200": #直接上传 start_send_size = 0 else: common.code_parsing(server_ack) return None # 服务端异常,中断上传 else: print("%s 不存在!!" % local_file) return None # 客户端异常,中断上传 #开始上传 fp = open(local_file, 'rb') fp.seek(start_send_size) while start_send_size < filesize: data = fp.read(4096) self.conn.send(data) start_send_size += len(data) common.view_bar(start_send_size, filesize) fp.close() result = self.conn.recv(1024).decode() common.code_parsing(result)
def get(self, arg): ''' 下载文件 :param arg: 下载的文件和本地路径 :return: ''' point = { 'action': arg[0], 'file': arg[1], 'user': self.isLogin, } self.conn.send(json.dumps(point).encode()) #发送文件指针,包含动作和下载的文件名 server_ack = self.conn.recv(1024).decode() if not server_ack == '404': server_ack = json.loads(server_ack) filename = server_ack['filename'] filesize = server_ack['filesize'] filemd5 = server_ack['md5'] #判断本地路径 if os.path.exists(arg[2]): #存在,说明不需要重命名 if os.path.isfile(arg[2]): #判断目标文件是否存在 print("%s本地文件已存在" % arg[2]) self.conn.send('error'.encode()) # 发送客户端状态 return None # 中断下载 else: tmp_filename = "%s_%s.tmp" % (filename, filemd5) # 临时文件名 tmp_file = os.path.join(arg[2], tmp_filename) #临时文件 file = os.path.join(arg[2], filename) #真实文件 else: #不存在,说明可能需要重命名 upper_file_path = os.path.dirname(arg[2]) #本地目标路径的上一级目录 if os.path.exists(upper_file_path): #上一级目录存在,说明需要重命名 filename = os.path.basename(arg[2]) tmp_filename = "%s_%s.tmp" % (filename, filemd5) # 临时文件名 tmp_file = os.path.join(upper_file_path, tmp_filename) file = arg[2] #真实文件为目标目录,最后一个为文件名 else: #上一级目录不存在,说明输入的路径的确不存在 print(print("本地路径不存在:%s" % arg[2])) self.conn.send('error'.encode()) # 发送客户端状态 return None #中断下载 #判断断点续传 if os.path.exists(tmp_file): #临时文件存在 while True: res = input("本地文件%s已存在,是否断点续传?[y/n]" % file) if res == 'y': start_size = os.stat(tmp_file).st_size open_file_type = 'ab' break elif res == 'n': start_size = 0 open_file_type = 'wb' break else: print("请输入y和n") else: start_size = 0 open_file_type = 'wb' #发送结果 self.conn.send(bytes("ok|%s" % start_size, encoding='utf-8')) fw = open(tmp_file, open_file_type) fw.seek(start_size) recv_size = start_size while recv_size < filesize: data = self.conn.recv(4096) fw.write(data) recv_size += len(data) common.view_bar(recv_size, filesize) fw.close() newmd5 = common.md5sum(tmp_file) # md5校验 if newmd5 == filemd5: shutil.move(tmp_file, file) print("文件下载成功") else: print("文件下载失败,md5不一致,服务端md5:%s" % filemd5) res = input("是否删除临时文件? [y/n] ") if res == 'y': os.remove(tmp_file) else: common.code_parsing(server_ack)