背景
作为一名Acmer我写了很多.cpp文件,其中经过编译、链接后又生成了许多.exe和.o文件。当我用github desktop将他们同步到我的github上是.exe和.o文件很碍事,尤其是.exe文件占用的空间很多。手动删除实在是太麻烦了,于是写一个能自动将指定目录下的指定扩展名文件删除的程序的想法油然而生,所幸经过我的一番忙碌这个程序成功的完成了,欣喜之余在这里分享下
功能
这个程序实现了将指定文件夹下的.exe和.o文件删除的功能,其中指定的文件夹由键盘输入
框架
写程序前要把想要写的框架和算法想清楚,这是每一个程序员应该牢记的。关于这个程序我的框架如下
1、采用递归的方法遍历文件目录
2、对于文件目录中的.exe和.o文件进行删除操作
具体实现
根据上面的框架我们知道在宏观上我们的工作有两步,接下来的工作就是实现上的了
由于第一部分比较难,所以我们先实现较简单的第二部分
第二部分
首先我们要删除.exe或.o文件,我们就要判断一个文件的扩展名是不是.exe或.o,这里涉及到三个问题,一个是获取文件扩展名,一个是判断扩展名是不是.exe或.o,还有一个是删除文件
删除文件好办,Python中有自带的删除文件的函数,在os里面
所以开始我们导入os包,再要删除文件时调用函数
os.remove(full_path)
由于要判断文件的扩展名是不是.exe或.o所以我们创建一个包含".exe"和".o"这两个字符串的元组,设置为全局变量判断是只需要一条in语句就可以了,如下
if extension in extensions:
获取文件的扩展名比较麻烦一些,不过也还好了,我把它封装到了一个函数里面,如下#获取文件的扩展名
def file_extension(path):
return os.path.splitext(path)[1]
第一部分
由于这一部分使用到了递归,所以相比第一部分要困难一些,不过也没关系让我们一点点来实现。
首先我们要获取指定目录下的所有文件和目录(也即获得该目录下的所有路径)
其次我们要判断一个路径是文件还是目录,如果是目录的话递归清理,如果是文件的话执行第二部分
先看获得所有的路径,这一步也可以用os里的函数实现,在这个程序中我把它封装成了一个函数,返回了一个列表
#返回指定目录下所有的文件和目录
def get_all_path(path):
return os.listdir(path)
判断一个文件是否是目录本来用os里的函数很简单,但是有一个细节要特别注意,那就是传入的路径必须是完整的,所以在判断之前我们要先调用一个函数生成完整目录然后在判断,如果是目录的话直接进行递归调用代码如下
#清理文件
def clear_dir(root_path):
paths = get_all_path(root_path) #得到目录下所有文件与目录
for path in paths:
full_path = os.path.join(root_path,path) #得到完整的路径名
if os.path.isdir(full_path): #如果是目录的递归清理
clear_dir(full_path)
else:
extension = file_extension(full_path) #如果是文件的话获取文件扩展名
if extension in extensions: #如果是要删除的文件则进行删除
os.remove(full_path)
完整代码
只给出部分代码的话,未必能完全表达我的想法,这样的话就与我分享的初衷相违背了,所以在这里我给出我的完整代码,希望大家能够读懂我的代码并指出我代码的不足
#coding:utf-8
import os
#extensions代表指定要删除的文件扩展名
extensions = (".exe",".o")
#返回指定目录下所有的文件和目录
def get_all_path(path):
return os.listdir(path)
#获取文件的扩展名
def file_extension(path):
return os.path.splitext(path)[1]
#清理文件
def clear_dir(root_path):
paths = get_all_path(root_path) #得到目录下所有文件与目录
for path in paths:
full_path = os.path.join(root_path,path) #得到完整的路径名
if os.path.isdir(full_path): #如果是目录的递归清理
clear_dir(full_path)
else:
extension = file_extension(full_path) #如果是文件的话获取文件扩展名
if extension in extensions: #如果是要删除的文件则进行删除
os.remove(full_path)
#程序主要逻辑,完成文件清理工作
def run():
path = raw_input("请输入要清理的文件目录")
clear_dir(path)
#如果作为主程序启动,开始执行代码
if __name__ == "__main__":
run()
V2.0
改进后的版本#coding:gbk #因为在win10下执行程序乱码所以改成gbk格式
import os
#默认的清理目录
default_path = "D:\ACM-Program"
#清理的文件数量
clear_file_number = 0
#extensions代表指定要删除的文件扩展名
extensions = (".exe",".o")
#清屏
def clear_screen():
os.system('cls')
#按任意键继续
def pause():
os.system('pause')
#打印N个指定的字符
def print_char(count, c):
for i in range(0,count):
print c,
#返回指定目录下所有的文件和目录
def get_all_path(path):
return os.listdir(path)
#获取文件的扩展名
def file_extension(path):
return os.path.splitext(path)[1]
#清理文件
def clear_dir(root_path):
clear_file_number = 0 #被清理的文件数量
paths = get_all_path(root_path) #得到目录下所有文件与目录
for path in paths:
full_path = os.path.join(root_path,path) #得到完整的路径名
if os.path.isdir(full_path): #如果是目录的递归清理
clear_file_number = clear_file_number + clear_dir(full_path)
else:
extension = file_extension(full_path) #如果是文件的话获取文件扩展名
if extension in extensions: #如果是要删除的文件则进行删除
os.remove(full_path)
clear_file_number = clear_file_number + 1 #被清理的文件数量+1
return clear_file_number
#主菜单
def menu():
print_char(15,' ')
print "文件清理机" #标题
print_char(15,' ')
print "运行模式"
print_char(15,' ') #选项
print "模式1、默认工作方式"
print_char(15, ' ')
print "模式2、由键盘输入要清理的文件目录"
print_char(15,' ')
print "模式3、查看要被清理的文件数量(默认文件夹)"
print_char(15,' ')
print "选项0、退出"
#寻找共有多少个需要被清理的文件
#递归实现,与清理文件相似
def find_file_number(root_path):
file_number = 0 #需要清理的文件数量
paths = get_all_path(root_path)
for path in paths:
full_path = os.path.join(root_path, path)
if os.path.isdir(full_path):
file_number = file_number + find_file_number(full_path)
else:
extension = file_extension(full_path)
if extension in extensions:
file_number = file_number + 1
return file_number
#程序主要逻辑,完成文件清理工作
def run():
while True:
menu()
clear_file_number = 0
way = raw_input("请选择工作方式")
if way == '1':
clear_file_number = clear_dir(default_path)
print "成功清理文件"+str(clear_file_number)+"个,请继续使用"
pause()
elif way == '2':
root_path = raw_input("请输入要清理的文件目录")
clear_file_number = clear_dir(root_path)
print "成功清理文件"+str(clear_file_number)+"个,请继续使用"
pause()
elif way == '3':
file_number = find_file_number(default_path)
print "共发现"+str(file_number)+"个需要清理的文件"
pause()
elif way == '0':
print "欢迎下次使用"
pause()
break
else:
print "输入非法指令,请重新输入指令"
pause()
clear_screen() #清屏
#如果作为主程序启动,开始执行代码
if __name__ == "__main__":
run()