Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
 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)
Exemplo n.º 4
0
 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())
Exemplo n.º 5
0
    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("缺少必须参数")
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)