PythonOS库练习——模拟linux文件管理命令

最近对Python大有兴趣,由于将官网文档看了一遍,但是看完只是简单的了解了Python的语法,而且还只是最基础的语法,所以后续除了了解Python的高级功能外(例外并发机制,锁机制,IO机制等),另一个重要要学习的就是Python的基本类库,如os/sys/datetime等。

本篇文章就是针对Python OS标准库的练习,OS库的功能主要是针对操作系统的文件管理,所以练习无外乎就是针对文件进行操作,如果只是普通的创建个文件/删除个文件/读写下文件/etc,感觉没啥意思,所以就想自己模拟Linux下的文件管理命令来实现一个Python版的,但是在写的过程中发现真的不简单,尤其对于我这样一个初学者来说,不过还是希望能够坚持下去~好了,废话不多说,能写多少写多少吧!

实现框架

首先介绍下整体的框架,框架通过FileManage类进入文件管理器;Context类用于定义上下文,上下文主要用来保存当前工作目录,以后可能还有用户信息等;Command类是一个父类,用于定义通用命令角色;LLCommand类继承自Command类,是一个具体的命令类,LLCommand是用于处理ll命令。目前整体架构还是很简单的。

# -*- coding: utf-8 -*-
'''
Created on 2015年11月16日

@author: Vicky
'''
import sys
import os
import datetime

__dir = ""

"""模拟资源管理器"""
class FileManage(object):
    '''
    classdocs
    '''
    __tab__ = "    "

    def __init__(self, _dir):
        '''
        Constructor
        '''
        self._dir = _dir
        self._context = Context(self._dir)
        os.chdir(self._dir)

    def _parse(self, inp):
        """解析用户输入"""
        _cmd, _params, _vals = ("", [], [])

        cmds = inp.split(" ")
        _len = len(cmds)
        _cmd = cmds[0]
        if _len > 1:
            for i in range(1, _len):
                if cmds[i].startswith("-"):
                    for s in cmds[i][1:]:
                        _params.append(s)
                else:
                    _vals.extend(cmds[i:])
                    break
        return (_cmd, _params, _vals)

    def __main__(self):
        while True:
            global __dir
            inp = input("fe[%s]:" % self._context._dir)
            res = self._parse(inp)
            if res[0] == "ll":
                LLCommand(self._context, res[0], res[1], res[2]).execute()
            elif res[0] == "cd":
                print(res)
            elif res[0] == "cp":
                print(res)
            elif res[0] == "exit":  # 退出
                print("logout...")
                sys.exit()
            else:
                print("-fe: %s: command not found" % res[0])

class Context(object):
    """上下文,保存信息,如当前工作空间"""
    def __init__(self, _dir):
        self._dir = _dir  # 当前用户目录

class Command(object):
        """命令"""
        def __init__(self, context, cmd=None, options=None, vals=None):
            """
            @param cmd: 命令
            @param options: 选项(-a)
            @param vals: 参数
            @param context:    上下文
            """
            if not context:
                raise Exception("context is necessary")
            self._cmd = cmd
            self._options = options
            self._vals = vals
            self._context = context

        def setCmd(self, cmd):
            self._cmd = cmd

        def setOptions(self, options):
            self._options = options

        def setVals(self, vals):
            self._vals = vals

        def execute(self):
            pass

def timeToStr(timestamp, _format = "%Y-%m-%d %H:%M:%S"):
    """将时间戳转成字符串"""
    _time = datetime.datetime.fromtimestamp(timestamp)
    return datetime.date.strftime(_time, _format)

if __name__ == "__main__":
    fm = FileManage("E:/Work/Python/files")
    fm.__main__()
ll命令实现

直接上代码吧,实现没有什么难度,只是简单的调用os函数而已。

class LLCommand(Command):
    """继承自Command,处理ll命令"""
    __tab__ = "\t"
    def execute(self):
        """执行命令"""
        _dirs = self._vals if self._vals else []
        if len(_dirs) == 0:
            _dirs.append(self._context._dir)

        # 循环列出目录下的文件
        for d in _dirs:
            self.__none(d)

    def __none(self, _dir):
        """递归列出子目录"""
        _recursion = False
        if "r" in self._options:
            _recursion = True
        files = []
        total = self._list(_dir, files, "", _recursion)
        print("total files:%s" % total)
        for f in files:
            print("{0:7d} {1:19s} {2:s}".format(*f))

    def _list(self, _dir, files, _tab="", recursion=False):
        old_dir = os.getcwd(); # 保存当前目录
        os.chdir(_dir) #进入需要遍历的目录
        _total = 0
        for f in os.listdir():
            _total = _total + 1
            stat = os.stat(f)
            _size = stat.st_size
            _time = timeToStr(int(stat.st_mtime))
            files.append((_size, _time, f))
            if recursion and os.path.isdir(f):
                _total = _total + self._list(f, _tab + self.__tab__, recursion, files)

        os.chdir(old_dir)  #进入原来的目录
        return _total

写下这篇文章主要是鼓励自己学下去,当然如果有人看见了,而且有好的建议,那么就请不宁赐教~


欢迎访问我的个人博客,寻找更多乐趣~

模拟Linux文件系统。在任一OS下,建立一个大文件,把它假象成一张盘,在其中实现一个简单的 模拟Linux文件系统 在现有机器硬盘上开辟20M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序对此空间进行管理,以模拟Linux文件系统,具体要求如下: (1) 要求盘块大小1k 正规文件 (2) i 结点文件类型 目录文件 (共1byte) 块设备 管道文件 物理地址(索引表) 共有13个表项,每表项2byte 文件长度 4byte 。联结计数 1byte (3)0号块 超级块 栈长度50 空闲盘块的管理:成组链接 ( UNIX) 位示图法 (Linux) (4)每建一个目录,分配4个物理块 文件名 14byte (5)目录项信息 i 结点号 2byte (6)结构: 0#: 超级块 1#-20#号为 i 结点区 20#-30#号为根目录区 3. 该管理程序的功能要求如下: (1) 能够显示整个系统信息,源文件可以进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) 建立文件(需给出文件名,文件长度)。 (7) 打开文件(显示文件所占的盘块)。 (8) 删除文件:删除指定文件,不存在时给出出错信息。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
1. 在现有机器硬盘上开辟100M的硬盘空间,作为设定的硬盘空间。 2. 编写一管理程序simdisk对此空间进行管理,以模拟Linux文件系统,要求: (1) 盘块大小1k (2) 空闲盘块的管理Linux位图法 (3) 结构:超级块, i结点区, 根目录区 3. 该simdisk管理程序的功能要求如下: (1) info: 显示整个系统信息(参考Linux文件系统的系统信息),文件可以根据用户进行读写保护。目录名和文件名支持全路径名和相对路径名,路径名各分量间用“/”隔开。 (2) cd …: 改变目录:改变当前工作目录,目录不存在时给出出错信息。 (3) dir …: 显示目录:显示指定目录下或当前目录下的信息,包括文件名、物理地址、保护码、文件长度、子目录等(带/s参数的dir命令,显示所有子目录)。 (4) md …: 创建目录:在指定路径或当前路径下创建指定目录。重名时给出错信息。 (5) rd …: 删除目录:删除指定目录下所有文件和子目录。要删目录不空时,要给出提示是否要删除。 (6) newfile …: 建立文件。 (7) cat …: 打开文件。 (8) copy …: 拷贝文件,除支持模拟Linux文件系统内部的文件拷贝外,还支持host文件系统与模拟Linux文件系统间的文件拷贝,host文件系统的文件命名为<host>…,如:将windows下D:盘的文件\data\sample\test.txt文件拷贝到模拟Linux文件系统中的/test/data目录,windows下D:盘的当前目录为D:\data,则使用命令: simdisk copy <host>D:\data\sample\test.txt /test/data 或者:simdisk copy <host>D:sample\test.txt /test/data (9) del …: 删除文件:删除指定文件,不存在时给出出错信息。 (10) check: 检测并恢复文件系统:对文件系统中的数据一致性进行检测,并自动根据文件系统的结构和信息进行数据再整理。 4. 程序的总体流程为: (1) 初始化文件目录; (2) 输出提示符,等待接受命令,分析键入的命令; (3) 对合法的命令,执行相应的处理程序,否则输出错误信息,继续等待新命令,直到键入EXIT退出为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值