@diyer22
2016-01-06T14:42:54.000000Z
字数 6003
阅读 3677
项目名称:
Python文件管理器开发者:
杨磊班级:
计科1403联系方式:
ylxx@live.com指导老师:
江志英
作为一个计算机重度使用者,硬盘空间经常处于紧张状态,特别是C:\盘,C:\盘在固态硬盘上,无法扩展,而且C:\盘下的文件结构多而混乱,通常我会定期清理磁盘,但有以下问题:
- Windows资源管理器并不能提供文件夹大小的显示和排序,让我管理不方便
- 我还经常使用CMD命令 “tree”来查看文件夹结构,然而,tree命令过于简陋,无法满足我的需求。
- 且CMD命令下输入文件名长的文件或文件夹是十分痛苦的(例如名字超长的电影文件),我也想解决这个输入体验的问题
综上,这次课设我打算开发一个有特色功能的Python版资源管理器,以满足以上需求
- 实现基本的CMD文件操作
- 可以默认显示文件夹大小
- 漂亮的展示文件夹的树形结构
- 可用编号代替文件名进行操作
- 可保存检索和工作进度
- 可直接在管理器中打开文件
注[1]:复制和剪切功能将在后续版本加入
注[2]:后续版本将添加图形界面
由于Python语言应用性强,数据处理方便,开发周期短等优点,以及此项目对性能要求不高,瓶颈多为I/O操作,所以最终选择了Pyhton 2.7来开发此项目
要想知道文件夹的大小,就必须要知道文件夹下所有文件的大小,再相加
文件夹与其下的文件的关系为树形关系
因此,抽象数据结构为树,将路径下文件的树形结构和数据结构的树要一一对应
由于我们主要目的是查看大小,因此还应在结构体中加入大小的数据
由于文件夹本来就是一种树形结构,因此我考虑的是使用Python中的字典数据类型来表示的广义表,来表示树
用键表示文件名,其值为一个字典,字典的内容是文件的属性
如一个1KB的文件的节点表示为:
'文件名':{'size':1024}如一个空文件夹的节点则表示为:
'文件夹名':{'file':{},'size':0}(键'file'对应的是字典)如果根文件夹中有子文件和子文件夹则:
'根文件夹名':{'file':{'子文件名':{},'子文件夹名':{}},'size':1024}
文件夹的子文件放在键'file'对应的字典里面当然,所有文件,文件夹都应该在一个字典中,我命名为PC,即:
PC={'file':{'根文件夹名':{}},'size':1024}
#全局数据PC = {} #主数据结构NowPath = '' #当前操作路径NowSort = [] #记录当前工作路径下文件的编号Root = '' #当前被索引的地方Roots = [] #记录被遍历过的地方即Root的listErrorTime = 0 #统计无法索引文件的个数ErrorPath = [] #记录无法索引的地址
import osimport pickle #保存用import copy #深度复制用def Lunch(): #起始函数#文件及字典操作类函数def File_to_Struct(Path,PC): #添加文件到广义表def Dir_to_Struct(Path,PC): #添加空文件夹到广义表def Creat_Root_Struct(Path,PC): #根据初始条件创造广义表结构def Add_Path_to_File(Path,PC): #分析是文件还是文件夹,执行相应的函数def Walk_Root(Root,PC,do): #前序遍历Root路径下的所有文件及文件夹并执行do函数def Init_Struct(Root,PC): #输入Root(要遍历的文件夹地址) 初始化数据结构def Del_Thing(top): #删除计算机系统里面的文件def Del_File_or_Dir(Path,PC): #删除操作#控制台函数区def Cin_CMD(PC): #输入指令的函数def CMD_to_Fun(string): #指令转换为对应函数#命令与操作函数对接的函数区def CD(Path,PC): #打开命令def Add_File(name,Path,PC):def Add_Dir(name,Path,PC):def ReName(Path,NewPath,PC): #重命名def Del_Path(Path,PC): #删除命令def For_Help():def Enlarge_Root(Path,PC): #扩大检索路径def Refresh(): #Roots路径刷新def Save_Data(): #保存进度def Load_Data(): #载入进度#可视化类函数def B_to_MB(b): #数据单位转换并显示def Sort_by_Size(dir): #创建文件夹下子文件的排序def Change_Now_Sort(Path,PC): #改变NowSortdef Cout_Dir(Path,PC): #输入链接查看文件夹并按照大小排序,显示大小def Tree_For_PC_With_Level(dir,deep,name = 'X.DIR',Tree_Level = 1): #传入文件夹的节点,带有深度版def Tree(Path,PC,deep): #输入路径#工具类函数def Path_to_List(Path): #将路径一层一层的分解为多个路径,用于Creat_Root_Struct()#以及其他非核心的工具类函数
def Walk_Root(Root,PC,do): #前序遍历Root路径下的所有文件及文件夹并执行do函数try: #有的文件夹没有权限进入,产生WindowsError错误,则记录他们,并跳过他们for lists in os.listdir(Root): #获得遍历路径下一层的文件名Path = os.path.join(Root,lists) #将名字转换为路径Path = Turn_Path(Path) #将路径标准化do(Path,PC) #并对每个文件执行do函数(即加入结构体)if os.path.isdir(Path): #如果是文件夹则继续遍历该文件夹except WindowsError,error:global ErrorTimeErrorTime+= 1 #如果没有权限,报错WindowsError则记录下来global ErrorPathErrorPath+= [(error,Root)]return
def Init_Struct(Root,PC):#输入Root(要遍历的文件夹地址) 初始化数据结构Root = Stand_Path(Root) #将路径标准化Creat_Root_Struct(Root,PC) #将要遍历的文件夹的母文件夹以及自己 加入结构体print ' (1/2) 正在遍历索引区:',Root,'并创建目录结构体,请稍等。。。\n'Walk_Root(Root,PC,Add_Path_to_File)#将要遍历的文件夹下的所有文件先序遍历执行Add_Path_to_File#Add_Path_to_File是将文件或文件夹加入结构体的函数Change_Now_Sort(Root,PC) #跳转了工作路径后要将sort编号更新global RootsRoots+= [Root] #将刚遍历过的路径记录下来print ' (2/2) 目录结构体已创建成功!可在目录',Root,'下管理文件\n'global ErrorTime #引入无法遍历的文件数量,如果有,通知用户有多少个if ErrorTime != 0:print '\n 注意:由于系统权限原因,一共有',ErrorTime,'个系统文件或文件夹未索引!\n'
初始界面要求用户输入路径,或载入已保存工作进度(第14行):
欢迎使用Python资源管理器 V0.2请输入文件索引路径,程序将在您输入完毕后对文件夹进行遍历例如 C:\ 或者直接回车(程序将遍历当前路径)遍历时可能需要您稍等片刻,具体等待时间和索引路径下的文件总数有关您也可以键入help,以查看帮助注意:大小写敏感,不需要加引号Tips:已检测到有可载入的进度,输入 load 进行载入。请输入文件索引路径(例如 C:\):
用户可输入 help\n 查看以下帮助:
命令 功能dir 查看当前文件列表回车 功能同dir,但更加方便tree (DEEP) 以图形界面显示当前文件夹的结构,如果有DEEP则只显示对应层数DEEP有负号,树形结构将输出遍历过的所有文件层数为绝对值的|DEEP|,-0便是全部层数CMD.no No 在命令CMD后加 .no 就会操作对应NO编号的文件save 保存进度,存储在当前文件夹,并命名为“Python文件管理器存储数据”load 载入存储的进度,如果在保存后更改过遍历过的文件,数据将会不准确refresh 如果你已经在管理器外操作过遍历过的文件,请使用此命令重新遍历allpc 遍历所有磁盘goto PATH 切换至PATH目录,并重新索引cd NAME 打开NAME文件或文件夹cd .. 返回上一层md NAME 添加文件夹,名字为NAMEmf NAME 添加文件,名字为NAMEdel NAME 删除文件夹或文件(注意:不是移动到回收站)ren NAME>NEW 重命名NAME为NEWq 结束程序
一开始工作路径输入为C:\ 盘时:
(由于内容太多,只展示前半部分的效果)
(1/2) 正在遍历索引区: C:/ 并创建目录结构体,请稍等。。。(2/2) 目录结构体已创建成功!可在目录 C:/ 下管理文件注意:由于系统权限原因,一共有 320 个系统文件或文件夹未索引!磁盘:C: 下有 44 个文件,已用空间:109GBUsersNo.00 type:DIR size:35.6GB ■■■■■■■■■■■■■■■■■■■■WindowsNo.01 type:DIR size:22.4GB ■■■■■■■■■■■■Program Files (x86)No.02 type:DIR size:17.1GB ■■■■■■■■■Program FilesNo.03 type:DIR size:9.2GB ■■■■■pagefile.sysNo.04 type: size:8.0GB ■■■■hiberfil.sysNo.05 type: size:6.3GB ■■■DNo.06 type:DIR size:3.5GB ■ProgramDataNo.07 type:DIR size:2.5GB ■
工作路径为 I:\测试 文件夹下时
输入指令tree:
混乱的结构也一览无余!(浏览时,宽度应大于 标准的%80)
文件夹:测试 路径:I:/测试 占用空间为:83.4MB 已检索全部文件|| 子文件------------------- type:DIR size:41.6MB| | kksd--------------------- type:DIR size:41.6MB| | | 6.mp4-------------------- type:mp4 size:41.6MB| | | 新建文件夹--------------- type:DIR size:12B| | | | 2.txt-------------------- type:txt size:6B| | | | 1.txt-------------------- type:txt size:6B| | |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | | 2.txt-------------------- type:txt size:6B| | | 1.txt-------------------- type:txt size:6B| |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | sd----------------------- type:DIR size:12B| | | 2.txt-------------------- type:txt size:6B| | | 1.txt-------------------- type:txt size:6B| |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | 2.txt-------------------- type:txt size:6B| | 1.txt-------------------- type:txt size:6B| | kks---------------------- type:DIR size:0B|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| 6.mp4-------------------- type:mp4 size:41.6MB| 2.jpg-------------------- type:jpg size:122KB| 1.txt-------------------- type:txt size:289B| 空子文件----------------- type:DIR size:0B ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
在使用allpc指令遍历过所以文件夹后
在任何工作路径下输入
输入tree -1(树形结构将输出遍历过的所有文件,层数为绝对值,即|-1|)
磁盘: 已用空间为:671GB 所显示的深度为: 1|| H:----------------------- type:DIR size:310GB| G:----------------------- type:DIR size:150GB| C:----------------------- type:DIR size:109GB| F:----------------------- type:DIR size:65.0GB| I:----------------------- type:DIR size:35.9GB ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
课程设计是一门培养学生综合运用所学知识,发现,提出,分析和解决实际问题的学科
对 Windows 下计算机的文件系统有了深刻的了解
对Python开发和树形数据结构更加熟练
有了一个不错的文件管理工具