Python 用os和win32api库模仿DOS命令dir (完整实例)

简介: Python 用os和win32api库模仿DOS命令dir (完整实例)

补全了上一篇《Python 使用os库函数listdir() 模拟DOS命令dir》,基本上能够模仿 dir 和 dir/w 的显示结果:


    驱动器 D 中的卷是 文档

    卷的序列号是 109A-0446

    D:\test 的目录

   [.]             [..]            [01]            01.py           [02]            

   02.py           [03]            

                  2 个文件             2,748 字节

                  5 个目录 315,430,735,872 可用字节

    驱动器 D 中的卷是 文档

    卷的序列号是 109A-0446

    D:\test 的目录

   2021/05/02  23:48    <DIR>          .

   2021/05/02  23:48    <DIR>          ..

   2021/05/02  22:56    <DIR>          01

   2021/04/03  12:09             1,486 01.py

   2021/05/02  22:56    <DIR>          02

   2021/04/03  12:09             1,262 02.py

   2021/05/02  23:48    <DIR>          03

                  2 个文件             2,748 字节

                  5 个目录 315,430,735,872 可用字节

    驱动器 E 中的卷是 数据

    卷的序列号是 109A-0537

    E:\ 的目录

   2021/05/04  23:39    <DIR>          【Download】

   2021/05/04  21:19    <DIR>          【ScannedDoc】

   2021/05/04  21:18         2,410,344 杨程驾驶证证件照.png

                  1 个文件         2,410,344 字节

                  2 个目录 300,126,973,952 可用字节



代码:

import os,time
from win32api import GetVolumeInformation as DiskVolume
from win32api import GetDiskFreeSpaceEx as FreeSpace
def attrib(fn):
    from win32api import GetFileAttributes as attr
    ret=str(bin(attr(fn)))
    del attr
    if ret[-2]=='0':
        return True
    else:
        return False
def pyDir(path=None,para=None):
    if path==None: path=os.getcwd()
    dt=lambda x:time.strftime('%Y/%m/%d  %H:%M   ',time.localtime(x))
    cnCount=lambda str:len([i for i in str if '\u4e00'<=i<='\u9fff'])
    _time=dt(os.path.getmtime(path))
    print(u' 驱动器 '+path[0].upper()+ u' 中的卷是 '+DiskVolume(path[0:2])[0])
    tmp=str(hex(DiskVolume(path[0:2])[1])).upper()
    if tmp[:2]=='0X': tmp=tmp[2:]
    diskVol=tmp[:4]+'-'+tmp[4:]
    print(u' 卷的序列号是',diskVol)
    print('\n '+path+u' 的目录\n')
    if path[-2:]!=':\\'and para!='/w':
        print(_time,'<DIR>'.ljust(14),'.')
        print(_time,'<DIR>'.ljust(14),'..')
    if path[-1]!='\\':
        path+='\\'
    if para==None:
        files=[i for i in os.listdir(path) if attrib(path+i)]
        _time=[dt(os.path.getmtime(path+i)) for i in files]
        _size=[os.path.getsize(path+i) for i in files]
        for i,fname in enumerate(files):
            print(_time[i],'<DIR>'.ljust(14) if os.path.isdir(path+fname) else format(_size[i],',').rjust(14),fname)
    elif para=='/w':
        files=[i for i in os.listdir(path) if attrib(path+i)]
        lenths=max([len(i)+cnCount(i)+2 if os.listdir(path) else len(i)+cnCount(i) for i in os.listdir(path)])
        if lenths<=16:
            fw=16
        elif 16<lenths<=20:
            fw=20
        elif 20<lenths<=40:
            fw=40
        elif lenths>40:
            fw=80
        if path[-2:]!=':\\':
            print('[.]'.ljust(fw),end='')
            print('[..]'.ljust(fw),end='')
        for i,fname in enumerate(files):
            if (i+2)*fw%80==0: print()
            cnCount=lambda str:len([i for i in str if '\u4e00'<=i<='\u9fff'])
            print((fname.ljust(fw-cnCount(fname)) if os.path.isfile(path+fname) else '['+fname+']').ljust(fw-cnCount(fname)),end='')
        print()
    fileSize=format(sum([os.path.getsize(path+i) for i in files if os.path.isfile(path+i)]),',')
    fileCount=len([i for i in files if os.path.isfile(path+i)])
    dirCount=len([i for i in files if os.path.isdir(path+i)])
    if path[-2:]!=':\\':dirCount+=2
    diskSize=format(FreeSpace(path[:2])[0],',')
    print(f'{fileCount} 个文件'.rjust(20),f' {fileSize} 字节'.rjust(20))
    print(f'{dirCount} 个目录'.rjust(20),f'{diskSize} 可用字节'.rjust(20))
    print()
pyDir('D:\\test','/w')
pyDir('D:\\test')
pyDir('E:\\')



dir命令默认是不列出隐藏文件或目录的;如果要列出隐藏的,可以在上述代码找到两处 if attrib(path+i) 删除这个条件掉即可 ,此时相当于命令:dir/a

代码用GetVolumeInformation 、 GetDiskFreeSpaceEx 和 GetFileAttributes求硬盘分区的卷号序列号、剩余空间字节数、文件属性等。


GetVolumeInformation() 返回磁盘卷标信息,返回值是一个5元素的tuple,分别对应:


  TCHAR       lpVolumeNameBuffer[1024];            //硬盘卷标名称   
  DWORD     dwVolumeSerialNumber;                 //序列号   
  DWORD     dwMaximumComponentLength;     //文件名最大长度   
  DWORD     FileSystemFlags;                            //文件系统标志   
  TCHAR       lpFileSystemNameBuffer[1024];    //文件系统名称   



其实序列号转成16进制数后去掉0x标记再在中间插入-字符,就与DOS命令dir显示的一样:如“卷的序列号是 109A-0446”

GetDiskFreeSpaceEx() 返回磁盘可用空间,返回值是一个3元素的tuple,分别对应:

LARGE_INTEGER  lpFreeBytesAvailableToCaller    //调用者可用空间的字节数
LARGE_INTEGER  lpTotalNumberOfBytes              //磁盘总容量的字节数
LARGE_INTEGER  lpTotalNumberOfFreeBytes      //磁盘的可用空间的字节数


GetFileAttributes() 对应DOS命令attrib,可以查看和修改文件或目录的属性。返回值是以下列表中的单个数值或它们任意几个的和都可以。进制转换可得到一个最长为16位的二进制数,各位上0,1就表示是否有对应属性,如返回22即2+4+16表示系统隐藏目录。判断文件或目录是否隐藏,请参见上述代码中自定义函数 attrib(fn)


   1 FILE_ATTRIBUTE_READONLY 只读

   2 FILE_ATTRIBUTE_HIDDEN 隐藏

   4 FILE_ATTRIBUTE_SYSTEM 系统

   16 FILE_ATTRIBUTE_DIRECTORY 目录

   32 FILE_ATTRIBUTE_ARCHIVE 存档

   64 FILE_ATTRIBUTE_DEVICE 保留

   128 FILE_ATTRIBUTE_NORMAL 正常

   256 FILE_ATTRIBUTE_TEMPORARY 临时

   ......之后的不常用,一直到2^15




目录
相关文章
|
弹性计算 人工智能 运维
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
阿里云操作系统控制台提供了便捷的服务器监控与管理功能,简化了运维工作。通过将多台服务器纳入统一监控平台,用户可以快速查看CPU、内存、磁盘和网络等关键资源的使用情况,避免了逐一远程连接查询的繁琐操作。此外,该工具支持自动化数据汇总,极大地方便了日报、周报和月报的编写。测试过程中,系统展示了良好的稳定性和响应速度,尤其在网络抖动和大文件健康状态测试中表现出色。整体体验流畅,显著提升了运维效率。 操作系统控制台地址:[点击访问](https://alinux.console.aliyun.com/)
506 26
摆脱繁琐命令-让运维更加流畅-阿里云ECS操作系统控制台运维篇
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
520 18
常用DOS命令操作总结
以上所述为常用DOS命令操作,可以帮助用户在计算机操作系统中完成常见任务。这些命令的掌握和熟练运用能对于提高工作效率及解决一些常见问题有很大帮助。新手使用时可通过输入“command /?”(如:`ipconfig /?`)查看命令详细用法和参数说明。慢慢熟悉这些命令,你会发现它们在日常操作中具有很高的实用性。
1121 20
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
1491 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
弹性计算 前端开发 Ubuntu
OS Copilot全命令测评报告
作为一名Web前端工程师,我使用OS Copilot的`-t`、`-f`和`|`功能进行了测试。通过创建ECS实例并安装OS Copilot,我顺利完成了以下任务: 1. 环境搭建:使用`-t`参数获取了详细的静态页面发布步骤,解决了环境配置问题 2. 多步操作:借助`-f`参数自动化安装和配置httpd服务器,简化了多步骤操作 3. 文件分析:利用`|`功能分析HTML文件内容,确认是否符合预期 整个过程顺畅无阻,特别是`-t`和`-f`功能极大提高了工作效率。建议将这些功能设为默认自带,以减少安装步骤。总结来说,OS Copilot在处理复杂任务时表现出色,提供了详尽的操作指引和自动化支持
233 8
|
搜索推荐
课时4:常用DOS命令
今天给大家带来分享是常用的DOS命令,以及如何使用命令,其主要分为以下七部分。 1.DIR 查看当前目录下的所有文件(夹) 2.CD 进入到指定的目录 3.“.”表示当前目录“..”表示上一级目录 4.方向键查看历史记录,tab 键自动补全命令 5.md 创建一个目录, RD 删除一个目录 6.del 删除一个文件, cls 清除屏幕 7.命令的语法
484 0
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
389 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
1812 5