def cp(fs: FileSystem, *args): """ 复制文件/目录参数-r :param fs: :param args: :return: """ if args[0] == '-h': print(""" 复制文件 cp xx/xx/src_filename xx/xx/tgt_dir 复制文件到其他目录 支持跨目录层级调用 仅支持复制文件 """) return if args[0] == '-r': path_src = args[1] path_tgt = args[2] else: path_src = args[0] path_tgt = args[1] name = path_src.split('/')[-1] # 取出文件名 cnt1 = len(path_src.split('/')) - 1 # 第一个目录的深度 cnt2 = len(path_tgt.split('/')) # 第二个目录的深度 text_copy = "" # 文件内容 cd(fs, '/'.join(path_src.split('/')[:-1])) pwd_cat = fs.load_pwd_obj() flag = pwd_cat.is_exist_son_files(name) if flag == -1: print("{} 文件不存在".format(name)) cd(fs, '/'.join(['..'] * cnt1)) return else: if flag == FILE_TYPE: inode_io = pwd_cat.son_files[name] inode = fs.get_inode(inode_id=inode_io) flag2, text = fs.load_files_block(inode) if flag2: text_copy = text # 传递内容 if flag == DIR_TYPE: print("不能复制文件夹") cd(fs, '/'.join(['..'] * cnt1)) return cd(fs, '/'.join(['..'] * cnt1)) # 增加到现在的目录下 cd(fs, '/'.join(path_tgt.split('/'))) touch(fs, name) pwd_cat_new = fs.load_pwd_obj() new_inode_io = pwd_cat_new.son_files[name] new_inode = fs.get_inode(inode_id=new_inode_io) fs.write_back(new_inode, pickle.dumps(text_copy)) new_inode.write_back(fs.fp) cd(fs, '/'.join(['..'] * cnt2))
def more(fs: FileSystem, name: str): """ 展示文件 :param fs: :param name: :return: """ if name and name == '-h': print(""" 显示文本内容 more file_name 不可跨目录层级调用 完全显示文本内容 """) return pwd_cat = fs.load_pwd_obj() # 当前目录 flag = pwd_cat.is_exist_son_files(name) if flag == -1: print("{} 文件不存在".format(name)) if flag == DIR_TYPE: print("{} 是文件夹".format(name)) if flag == FILE_TYPE: inode_io = pwd_cat.get_file(name) inode = fs.get_inode(inode_id=inode_io) flag, text = fs.load_files_block(inode) if flag: print(text) else: print("cannot open file .: Permission denied")
def mv(fs: FileSystem, *args): """ 剪切文件或目录 mv home/ywq/demo home/caohang :param fs: :param args: :return: """ if args[0] == '-h': print(""" 剪切文件或目录: mv xx/xx/src xx/xx/tgt 可以跨目录层级剪切目录或文件到其他目录 """) return path_src = args[0] # home/ywq/demo path_tgt = args[1] # home/caohang name = path_src.split('/')[-1] # 取出文件名 cnt1 = len(path_src.split('/')) - 1 # 第一个目录的深度 cnt2 = len(path_tgt.split('/')) # 第二个目录的深度 inode_io = 0 # 删掉原来的目录 cd(fs, '/'.join(path_src.split('/')[:-1])) pwd_cat = fs.load_pwd_obj() # 当前目录块 flag = pwd_cat.is_exist_son_files(name) if flag == -1: print("{} 文件不存在".format(name)) cd(fs, '/'.join(['..'] * cnt1)) return else: if flag == FILE_TYPE: inode_io = pwd_cat.son_files[name] if flag == DIR_TYPE: inode_io = pwd_cat.son_dirs[name] pwd_cat.remove(name, flag) fs.write_back(fs.pwd_inode, bytes(pwd_cat)) cd(fs, '/'.join(['..'] * cnt1)) # 增加到现在的目录下 cd(fs, '/'.join(path_tgt.split('/'))) pwd_cat_new = fs.load_pwd_obj() # 要增加的目录块 if flag == FILE_TYPE: pwd_cat_new.add_new_file(name, inode_io) if flag == DIR_TYPE: inode = fs.get_inode(inode_io) new_cat = inode.get_target_obj(fs.fp) new_cat.parent_inode_id = fs.pwd_inode.i_no pwd_cat_new.add_new_cat(name, inode_io) fs.write_back(inode, bytes(new_cat)) fs.write_back(fs.pwd_inode, bytes(pwd_cat_new)) cd(fs, '/'.join(['..'] * cnt2))
def stat(fs: FileSystem, name): if name == '-h': print(""" 显示文件详情 stat filename/dirname 不可跨目录层级调用 """) return pwd_cat = fs.load_pwd_obj() type_x = pwd_cat.is_exist_son_files(name) if type_x == -1: return inode_id = pwd_cat.get_inode_id(name, type_x) inode = fs.get_inode(inode_id) inode.show_detail_info(fs.fp)
def vim(fs: FileSystem, name: str): """ 向文件中输入内容,或者是修改文件 :param fs: :param name: :return: """ if name == '-h': print(""" 编辑文件中的内容 vim file_name 不可跨层级调用 命令使用后会打开一个线程单独运行文本编辑器 """) return pwd_cat = fs.load_pwd_obj() # 当前目录 flag = pwd_cat.is_exist_son_files(name) if flag == -1: touch(fs, name) vim(fs, name) return if flag == DIR_TYPE: print("{} 是文件夹".format(name)) if flag == FILE_TYPE: inode_io = pwd_cat.get_file(name) inode = fs.get_inode(inode_id=inode_io) if check_auth(inode.user_id, fs.current_user_id): def func(): flag_x, s = fs.load_files_block(inode) if not s: s = '' te = TextEdit(s) te.run() s = te.s if len(pickle.dumps(s)) <= (13 * BLOCK_SIZE - 100): fs.write_back(inode, pickle.dumps(s)) inode.write_back(fs.fp) else: print("out of size") vim_thread = Thread(target=func) vim_thread.start() else: print("cannot edit file .: Permission denied")
def useradd(fs: FileSystem, *args): """ 添加用户,并将用户目录挂载到base/home/下 :param fs: :return: """ if args and args[0] == '-h': print(""" 添加用户 使用方法直接输入useradd不需要参数 只有root用户可以使用此命令 添加完用户后会在base/home/下新建对应的用户文件目录 命名为用户名 """) return if fs.current_user_id != ROOT_ID: print("非root用户无权添加账户") return user_name, user_id = fs.add_user(fs.current_user_id) # 通过base目录切换到home目录 base_cat = fs.load_base_obj() home_id = base_cat.get_dir('home') home_inode = fs.get_inode(home_id) home_cat = home_inode.get_target_obj(fs.fp) if not home_cat: return # 获取新的目录的inode,并添加到home目录中 new_inode = fs.get_new_inode(user_id=user_id) home_cat.add_new_cat(name=user_name, inode_id=new_inode.i_no) # 新建新的用户目录 new_cat = fs.get_new_cat(name=user_name, parent_inode_id=home_id) # 写回新建的目录,和home目录 fs.write_back(new_inode, bytes(new_cat)) fs.write_back(home_inode, bytes(home_cat)) # 写回对应的被修改的节点 new_inode.write_back(fs.fp) home_inode.write_back(fs.fp)