1 背景
因为微信当前的架构原因,相同的文件在不同的聊天对象、聊天群之间转发时,每一次转发,微信都会将文件下载保存一次(过大的需要手动下载的文件除外)。同时小文件微信自动储存的方式也是通常也是储存两次,即每一个文件,微信都会下载两次。如下图所示:
这种机制也就导致了微信储存文件的文件夹及其占空间,而且由于其中大量文件为副本,也导致了寻找文件的不方便性。同时由于文件的大量性,想人工删除重复文件又显得工作量巨大。全部删除又可能出现日后找文件时出现“文件被删除”、“文件过期”的囧境。
因此笔者之前编写了一个Python程序,借助该程序我们便可以轻松删除重复文件(源代码在文尾)。
2 程序概述
Author:SouthDream
CodeName:Clear_File_v2.0
Version:2.0
Date:20223-11-23
Function:删除文件夹中的重复性文件
Background:微信同一个文件不停转发后,每转发一次都会生成一次副本,以“(num)”结尾。本程序用以删除这些因为转发而产生的重复文件
Input:输入文件路径
Output:删除的文件名,以及被删除文件所属目录,以及删除的重复文件的总数
Notes:打开待删除文件夹的属性,关闭“只读”属性;以管理员权限运行本程序
3 程序演示
3.1 输入
路径输入到待处理文件夹的上一级目录即可,如图,一般微信的文件存储位置文件目录如图所示,若想对全部的文件夹进行删重处理,路径输入到File即可。
3.2 输出
完成输入后,程序便会自动遍历当前路径下的所有目录及文件,并删除处于同一目录下的相同文件(以文件名作为识别,不识别文件真实内容)。
如下图所示,程序会逐目录进行查找,并删除。在完成所有删除后,程序会输出此次删除的文件数量。
4 注意事项
一定要“打开待删除文件夹的属性,关闭“只读”属性;以管理员权限运行本程序”,否则程序虽然可以识别出要删除的文件,但是却会因为权限不足,无法删除,出现下图这种情况:
4.1 以管理员权限运行本程序
如使用VsCode运行程序,打开VsCode时如下图操作即可。其他运行方式也是一样的道理。
4.2 关闭“只读”属性
在待处理文件夹的上级目录打开目录属性,关闭“只读”即可,程序处理完成后,文件夹会自动恢复到“只读”状态,不会影响日后使用。
5 源代码
"""
Author:SouthDream
CodeName:Clear_File_v2.0
Version:2.0
Date:20223-11-23
Function:删除文件夹中的重复性文件
Background:微信同一个文件不停转发后,每转发一次都会生成一次副本,以“(num)”结尾。本程序用以删除这些因为转发而产生的重复文件
Input:输入文件路径
Output:删除的文件名,以及被删除文件所属目录,以及删除的重复文件的总数
Notes:打开待删除文件夹的属性,关闭“只读”属性;以管理员权限运行本程序
"""
import os
def Analyse(filePath , fileList , fileDict):
print("Analysing........\n")
for file in fileList :
if "(" in file:
dictKey = file[:file.find("(")]
else :
dictKey = file[:file.find(".")]
fileTime = os.path.getatime(os.path.join(filePath,file))
if dictKey not in fileDict.keys() :
fileDict[dictKey] = list()
fileDict[dictKey].append(tuple([file,fileTime]))
else :
fileDict[dictKey].append(tuple([file,fileTime]))
for Key in fileDict.keys() :
fileDict[Key].sort(key=lambda x: x[1])
fileDict[Key].reverse()
def DelFile(filePath , fileDict):
print("Delfile........\n")
#PrintDict(fileDict)
for keyWord in fileDict.keys() :
#print(type(fileDict[keyWord]))
if len(fileDict[keyWord]) < 2 :
continue
else :
while(len(fileDict[keyWord])>=2) :
popItem = fileDict[keyWord].pop()
print(f"deleteFile = {popItem[0]}")
global count
try:
os.remove(os.path.join(filePath,popItem[0]))
count += 1
except PermissionError:
print("Unable to delete file. Please check if the file is in use or try running your program with higher permissions.")
def PrintDict(fileDict) :
for item in fileDict :
print(item)
if __name__ == "__main__" :
Father_path = input("Please input the file path:")
global count
count = 0
for root, dirs, files in os.walk(Father_path) :
for name in dirs:
path = os.path.join(root,name)
files = os.listdir(path)
global analysis
analysis = {}
print(f"Folder:{path}")
Analyse(path,files,analysis)
DelFile(path,analysis)
print("Delete Compelete.........\n\n")
print(f"The number of deleted file is {count}")