Esempio n. 1
0
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))
Esempio n. 2
0
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")
Esempio n. 3
0
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))
Esempio n. 4
0
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)
Esempio n. 5
0
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")
Esempio n. 6
0
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)