这里是删除临时文件,该功能是协议配置平台中的一个脚本,关于协议配置平台,参照这里,第一个就是。
项目部署后,用户使用过程中,会产生很多没用的文件,主要来源包括:
- 添加或编辑时,预览过程中产生的临时文档;
- 上线(同步到云存储)之后的文档;
需要将这些文件删除,我采用的方式是定时批量删除的方案,为了防止删除正在预览或未同步的文档,删除时,设置了一个规则:只删除最后修改时间在一小时以上的文件。
为了优化操作,还添加了在不同时间段指定不同的删除频率来降低CPU使用率的策略。9:00-22:00 每半小时清理一次;22:00-次日9:00,每两小时清理一次;
具体实现
用到的特殊模块或方法:
- time.sleep(秒数) :推迟当前线程的执行,参数为推迟的秒数;即多少秒后继续执行后边的逻辑;
- os.walk(path):文件、目录遍历器,可以高效的处理文件、目录相关的操作;
- os.path.getmtime(filePath):获取文档的最后修改时间;
#!/usr/bin/env python
# coding=utf-8
import sys, json, os, shutil, re, time
import psutil
reload(sys)
sys.setdefaultencoding('utf8')
# 按时间段设置 检测间隔
# 时间段:时间间隔(分钟)
timeArr = {
0: 60 * 2, # 2小时检测一次
7: 30, # 工作时间30分钟检测一次
22: 60 * 2
}
# 删除更新时间超过1小时的文件
delFileTime = 60 * 60 * 1
def delete_main(uploadPath):
nowTime = time.time()
# root 当前目录路径 # dirs 当前路径下所有子目录 # files 当前路径下所有非目录子文件
print(u'检测删除:' + uploadPath)
for root, dirs, files in os.walk(uploadPath):
for fileItem in files:
allPath = root + '\\' + str(fileItem)
updateTime = os.path.getmtime(allPath)
timeSpan = nowTime - updateTime
if (timeSpan > delFileTime):
os.remove(allPath)
print(u'删除:' + allPath)
# 获取当前时间的时间间隔
def getTimeSpan():
timeArr[24] = 0
timeList = timeArr.items()
timeList.reverse()
localtime = time.localtime(time.time())
hour = localtime.tm_hour
i = 0
timeLen = len(timeList)
for key, value in timeList:
if (i >= timeLen - 1):
break
if (hour > key):
return value * 60
i += 1
# 默认1小时
return 60 * 60 * 1
# 获取脚本文件的当前路径,不包括文件名 E:\Mine\store\python\start\learn\request
def getCurPath():
# 获取脚本路径
path = sys.path[0]
# 判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
if os.path.isdir(path):
return path
elif os.path.isfile(path):
return os.path.dirname(path)
if __name__ == "__main__":
curPath = getCurPath() # E:/Mine/toolset/protocol-builder/script/task
curPath = re.sub(r'script\\task', '', curPath)
arr = [curPath + 'public/upload', curPath + 'server/output']
print(u"删除目录:" + str(arr))
# 删除
while True:
i = 0
for path1 in arr:
delete_main(path1)
i += 1
timeSpan = getTimeSpan()
time.sleep(timeSpan)