文章目录
一、需求分析
(1)文件夹动态监控:Windows系统C盘是系统盘,存储着很多重要的数据文件,可用空间一开始很充足,但是电脑在使用一段时间后,我们会发现C盘空间越来越大。这是Windows系统的一个通病,于是我希望制作一个能够对选定文件夹实时监测的程序,这个程序不同于Windows自身自带的资源管理器,它能够动态且自动监测文件夹中文件的创建、修改与删除的变化(当然程序需要一直挂在后台),并把文件变化的时间和路径反馈给用户,使用户能在第一时间知晓究竟是哪些文件是系统盘(或者是其他磁盘)变大的始作俑者。
(2)临时文件探测与CPU监控:我们常用的系统优化软件往往有捆绑安装与投送广告的倾向,360安全卫士,鲁大师,QQ电脑管家这种问题尤为严重。在此我便设想制作一个能够简单集成我们常用的鲁大师实时系统监测和系统临时文件探测与清理的GUI小程序,来避免像360捆绑安装和开机自启动的这些问题。
(3)资源管理器:有时候,我们会需要了解一个文件夹的大小,存储文件的数量及大小,Windows自带的资源管理器能够做到这一点,但是它有一个缺陷,便是一次只能查找到当前文件夹中的大文件,而不能找到当前文件夹中子文件夹中的大文件,考虑到360安全卫士里面有一个查找大文件的工具,于是我便想利用Python进行实现。
(4)文件探查:对于一个敲代码的学生来说,我们常常需要获取一个文件的MD5码值及其他相关信息,右键文件属性能看到大部分信息,但是不能查看到它的加密信息,于是在GUI程序里面我便集成了MD5码,SAH1码的查询功能,方便对文件进行校验。
(5)自动关机:一到夜间4G的速度就从几百kb/s降到了几十kb/s,因此我们常常需要开启电脑热点来给手机续航。但是,上铺的我们在熄灯之后不想再下来把电脑关了,这时就需要对电脑定时关机。其实,Windows电脑可以用控制台命令和创建计划任务对电脑实现定时关机,但是对控制台命令来说,很多人不知道如何操作输入指令(at 03:00 /every:M,T,W,Th,F,S,Su shutdown -s -t 30从星期一至星期天,每天凌晨3点关机,关机前有30秒时间提示!);对计划任务来说,首先得打开控制面板,创建新任务,然后把指令什么的输进去,特别是在win10电脑中,当初我找计划任务这个面板找了很久,这样很费功夫。另外如果我们想取消定时关机,那么对于Windows电脑来说也是一个很麻烦的事。于是在GUI程序中,我增加一个定时关机的功能,能够设置与取消定时关机,更重要的是能够在关机之前保存。(此部分不是重点)
声明:原创(参考资料附后)
二、程序分析与设计
(1)程序运行与事件触发机制
即将要做的GUI程序包含多个函数功能,更重要的是要对系统进行动态监控。考虑到GUI程序在执行动态更新函数时,如果函数的执行时间过长,则会导致程序进入假死状态,无法操作和移动窗口。这时就需要进行多线程编程。通过对threading模块的研究,我将每种不同的功能的事件触发模块进行分块,并最终集成在一个主界面中。
另外对于事件所触发的功能则放在另外一个类中,外部定义一个类(class WorkerThread(Thread))用来执行主界面使用类中的事件。主函数中需要执行的事件将通过参数传入外部多线程类中同步执行。外部多线程类产生的消息将通过wx.lib.pubsub中的pub来传递给已订阅该消息的主函数及其模块。
图例:
(2)文件夹动态监控模块
工欲善其事,必先利其器。需要动态监控,我首先选择了watchdog和logging两个模块。首先我用watchdog来监控指定目录/文件的变化,如添加删除文件或目录、修改文件内容、重命名文件或目录等,每种变化都会产生一个事件,且有一个特定的事件类与之对应。
但是查找到watchdog的使用手册我发现,watchdog的消息只能通过系统警告发送到控制台中,不能以普通的str字符串类型的数据传送给控制台,因此,我利用logging模块中的logging.info等消息使得先写入外部数据库文件,然后程序再从数据库文件中读取数据并利用多线程传送到GUI界面中。
另外为了防止重复输出数据库中的信息,我再使用一个函数对立面的消息进行甄别和筛选。并增加了用户选择功能,使用户选择所需要监控的文件操作:文件创建,文件修改或者是文件删除。
图例:
(3)文件探查模块
对于文件资源查找的这部分就稍微简单了,利用上课所学的os.walk()的知识对文件夹进行遍历。为了获取文件的大小,我另外增加了两个数组,FileSize和BigFile在遍历的过程中,将文件的大小和路径保存起来,这样用户如果要查找大文件的话直接利用根据用户指定的文件大小从FileSize中提取出来。
为了使用户获得MD5码和SHA1码的值,我导入了hashlib这个模块,这样就不要我费尽心思得写MD5的算法,并且这样的效率还很高(所以人生苦短,我用python)。
(4)临时文件探查与删除模块
这一部分一开始我想利用os.walk()的同时对文件名进行甄别,如果是临时文件,那么就删除,否则跳过。
百度搜索了一下关于Python如何清理垃圾文件的脚本(参考资料另附),我看到大家的思路都是这样,我研究了网上比较流行的一个脚本(如图)
我发现有些文件由于系统权限问题无法删除这样这样会导致异常。另外用户也不能自我选定需要删除的垃圾文件。因此我在GUI程序中首先增加了异常处理,另外增加用户选择功能,保护用户重要的文件不被删除。
(5)硬件排行模块
首先我选定了一个硬件天梯网站进行爬虫操作(如图)
这个网站是静态的而且结构清晰。我直接利用BeautifulSoup进行爬取。
利用这样两行代码获取所需要的数据(soup = BeautifulSoup(wb_data, 'lxml')
data = soup.find_all('tr'))另外再通过简单的处理对数据格式优化输出在GUI界面中。我增加了用户选择功能这样用户可以选择所需要抓取的排行的大小。当然我也增加了网络异常的处理机制。
(6)CPU与内存动态更新实现
和文件夹动态监控类似,我首先选择了psutil,模块,它能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。利用多线程消息传递,我在初始化界面时便开始这个进程。
本来这个只是数字的显示,但是我希望能够美化界面。想到了使用matplotlib模块来画图,但是要实现画图的动态更新即使是利用多线程也会使界面进入假死状态,而且需要修改的代码十分庞大(整个GUI界面中需要再次嵌入matplotlib的GUI界面)。因此我放弃这个想法,利用GUI界面中提供的进度条来进行CPU和内存的动态美化显示。
(7)定时关机设置
利用os.system模块直接写控制台命令shutdown -s -t %d和shutdown -a
命令进行控制。这部分不是重点就不具体阐释了。
三、程序开发与测试
(根据测试驱动开发TDD,在功能代码之前,先编写测试代码,因此这里的开发与测试放在一起写)
开发环境:Python3 based on Pycharm2017.2.2
GUI选择:wxpython
(1)主界面
功能:
①各功能触发器设计
②CPU与内存动态显示
③菜单栏设计
④定时关机模块
⑤界面透明度(美化)
⑥意见反馈
主界面测试:
①显示电脑的基本信息正常
②内存与CPU显示正常
③事件触发正常
④定时关机与取消正常
⑤菜单栏事件触发正常
⑥浏览器打开与界面透明度测试正常
(2)文件夹动态监控界面
功能:
①文件探查类型选择
②文件夹选择
③文件操作停止
④文件夹清空与复制到剪切板
文件夹动态监控界面测试:
①当没有选择文件时显示错误
②选择指定的文件夹并监控
在指定文件夹下创建新的文本文件并改名为Python测试文件
删除文件
③复制到剪切板,清空面板与停止操作
(3)临时文件探测工具
功能:
①选择并检测系统垃圾
②选择并删除系统垃圾
测试:
(4)硬件排行模块
功能:
①根据指定数量查找所需要的排名信息
②复制到剪切板
测试:
(5)文件信息探查
功能:
①查看磁盘信息
②查看文件信息(包括修改时间,MD5码等)
③文件夹信息查看
④输出文件夹文件
⑤查找大文件
测试:
①磁盘信息查看正常
分盘信息显示盘符,格式,权限
②文件信息检测
这里我选择一个大的电影文件进行检测
正确显示文件信息
③文件夹信息检测并输出文件
文件夹信息检测结果正常
④输出大文件
先选择文件大小:
正确输出:
⑤停止操作
下面我选择一个文件特别多的文件夹进行检测
文件夹太多,用户不想看了需要进行停止操作
正常!
(6)界面美化
界面美化与透明度设置均使用wxpython中提供的方法和函数
图片来自外部依赖文件
(7)程序打包
利用Pyinstaller对程序进行打包
打包命令:pyinstaller -F -w Sysniffer.spec
打包后的文件:
运行时请打开Sysniffer.exe文件,其它文件不要移动位置,否则外部依赖项加载会失败。
四、程序评价
该GUI程序实现了文件夹动态监控、文件信息探查、临时文件探查与清理、硬件排行抓取、定时关机的功能。
经过三次大版本的修改与功能的增加,最终实现了Sysniffer3.1系统资源探测器程序,最终得分99。
五、参考文献
① Python 模块学习:threading 多线程http://python.jobbole.com/81546/
② tinkerGUI 垃圾清理http://blog.csdn.net/u013511642/article/details/50588121
③ Python 笔记之 psutil 模块http://www.cnblogs.com/liuyao/p/5678157.html
④ wxpython 官网http://www.wxpython.org/
⑤ Python 模块学习:logging 日志 http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html
⑥ Pyinstaller 打包学习:http://www.pyinstaller.org/
程序下载
关注图灵技术域微信公众号回复:sysniffer或点击此链接:http://download.csdn.net/download/xyisv/10236804