企鹅用户的数据清理痛点
电脑QQ用户有一个长期的痛点,那就是QQ经常下载没有用的广告、聊天图片、文件缓存,占据大量磁盘空间,导致C盘爆掉。
网上有五花八门的清理方法,但都很散乱。就我搜索到的清理数据途径大概有几种:
(1)删除特定群聊/私聊的聊天记录:直接在“消息管理器”中删除
(2)QQ中自带的“文件管理-个人文件夹清理”
默认放在一个叫Tencent Files\QQ号的文件夹下面,这个可以自定义。
(3)XX电脑管家等第三方的检测清理软件
没用过。我不想为了一个小需求而安装整个软件。
(4)手动找出数据储存目录进行清理
一般很难知道具体可以清理的路径是什么,而且手动清理太累了。
以上的途径都遗留不少问题。比如,感觉清理得还是不彻底、或者扫描清理过程太慢了。如果是一台陈年旧电脑,能直接搞崩溃。
造成这件事情的根本原因,就是企鹅的文件构建方式太弱智了,让某些文件夹难以被检测到(如group2文件夹),而且让逐个遍历的过程变得巨麻烦。
相关问题的讨论可以参考知乎问题: QQ文件夹下面群图片存储怎么多出了一个Group2? - 知乎
另外,我们自己也会有一些自己更个性化的需求,通用的方法没法照顾到,手工完成又太累。
所以我决定从QQ本地文件夹入手,通过精细化的目录拆解方法,用脚本删掉那些对自己来说不需要保留的文件,以一劳永逸地解决这个问题。
要提示的是,分享教程的目的,不是让copy代码就完事,而是体会构建这个脚本的核心方法。
了解QQ文件夹的结构
为了便于管理,我从磁盘划出来了一个独立的分区(也就是DEFG盘)用来储存QQ、微信的这些常清的数据,避免祸害C盘。(也因为低估了这个空间,分出来没用几天就爆掉,所以我才要写这个脚本……)
以默认目录Tencent Files为例,一般下面有QQ号组成的子目录,以及All Users子目录。
首先清理QQ号目录。这个目录代表着这个账号的数据。
关于下层的文件夹,我列了一个表格总结它们负责存放什么内容(参考网上资料和亲测),以及所采取的处理策略:
这个表格只是列举了一些,有很多没弄清楚用途的(特别是.db这种加密过的数据库)就先不处理了,日后我会慢慢把这个表格补充完整。
总的来说,处理策略大概可以分为3种:
(1)马上删掉的
比如广告、群聊图片、各种可再生的缓存,删掉不会有任何影响。
(2)定期清理的
比如n个月以前的工作文件,语音等等,这个很好理解。
(3)长期保留的
除非是换电脑之类的需要批量迁移数据的情况,随便删掉的风险较大的文件。比如msg3.0index.db、Msg3.0.db这2个大文件,收集了所有QQ聊天记录,直接删掉的风险较大,但不删的话文件大小却每天都在增长,占掉很多空间。
相关的讨论可以参考这篇win10电脑C盘内存不断减少解决方案(C盘爆满、Msg3.0index.db)_净无邪博客-CSDN博客_msg3.0index
在定义了自己要清理哪些文件以后,就可以开始写脚本了。
写简单的powershell脚本
因为我用的是windows系统,所以用powershell来写了个QQcleaner.ps1脚本。(如果是linux系统,道理应该也一样)
今天发的粗糙版本实现了:对特定的文件夹的清理,可以做到对“定期清理类”数据的自定义天数之前文件的清理,并且可以处理多个QQ账号。
要说明的是,脚本还有很多漏洞,每个人的文件夹情况也有可能不同,需要自行调整。
脚本涉及的powershell命令主要有下面几个:
#0.默省的变量声明
$myQQfiledir=<默认目录的路径> #如Tencent Files
$id=<QQ号>
$TimeOutDays=14 #假定清理半个月之前的文件
#1. 删除文件和文件夹的命令
Remove-Item <要删除的文件或路径> -Recurse
# -Recurse参数是为了递归删除下面所有子项,除此以外还可以加-force,-confirm等。
# 这个其实还可以改成不删除Ads文件夹,只删除下面的子项。不过就算删了QQ也会自己新建回来,所以删掉也无所谓。
#2. foreach函数进行遍历
foreach(<变量> in <变量列表>)
{
#处理的语句
}
#3. 把进程声明打印到屏幕
Write-Host <要打印的内容> -NoNewline
#这个可以提示目前正在清理哪个目录
#-NoNewline 用于不在新行打印后一句内容
#4. 函数的定义和调用
Function cleanlog ($arg1,$arg2) #传入两个参数
{
#函数的内容
}
cleanlog $arg1 $arg2
#5.时间日期的提取
get-date #系统当前日期和时间
$files.lastwritetime #$files 这个文件的最后修改时间
# 当然,也可以用$files.creationtime的最后创建时间来计算
((get-date)-$files.lastwritetime).days #两个时间相减,以天数为单位表示结果
#6.检查空目录
Test-Path <路径>
完整代码:
#QQ文件清理工具
#powershell中调用的命令: QQcleaner.ps1
#若遇到禁止执行,先输入set-ExecutionPolicy RemoteSigned
#默认设置#
$myQQfiledir='C:\xxx' #腾讯QQ中设置默认文件储存目录
$QQnumbers='888888888','888888888' #我的两个QQ账号
$TimeOutDays=14 #多少天前的文件
#定义垃圾文件函数
Function cleanrubbish ($id)
{
#可清理的垃圾文件夹名单
$myrubbishdir='Video','Audio','Ads','QZoneLover','Image\Group2\','CloudRes','SelCreateGroupHead','VasscUpdate','Image\HistroyHead','Image\MarktingMsgCachePic','Image\Thumbnails','Image\PhotoWall','MyCollection','GroupCollection','Image'
foreach( $rubbish in $myrubbishdir)
{
Write-Host ('checking:'+$myQQfiledir+'\'+$id+'\'+$rubbish) -NoNewline
if (Test-Path ($myQQfiledir+'\'+$id+'\'+$rubbish)) #目录存在时再处理
{
Remove-Item ($myQQfiledir+'\'+$id+'\'+$rubbish) -Recurse
Write-Host (' >>> done.')
}
else{Write-Host (' >>> skipped.') } #目录不存在时跳过
}
Write-Host "___________cleaning all rubbish!___________"
}
#定义定期清理文件函数
Function cleanlog ($id,$TimeOutDays)
{ #定义待清理的log目录列表
$mylogdir='Image\C2C','Image\Thumbnails','FileRecv'
#$id='809600520'
foreach($logdir in $mylogdir)
{
$filePath=$myQQfiledir+'\'+$id+'\'+$logdir
Write-Host ('checking:'+$filePath) -NoNewline
if (Test-Path $filePath) #检查是否空目录
{ #获取非空目录下所有文件
$files=get-childitem -path $filePath
foreach($file in $files)
{
#计算距今天的时间(按最后修改日期或创建日期)
$daypan=((get-date)-$file.lastwritetime).days #$daypan=((get-date)-$file.creationtime).days
#判断超过一定范围时间的文件清理掉
if ($daypan -gt $TimeOutDays){
remove-item $file.fullname -Recurse
Write-Host $file' >>> done.'
}
}
}
else{Write-Host (' >>> skipped.')}
}
Write-Host "___________ cleaning all log!___________"
}
#批量执行
foreach($id in $QQnumbers)
{
Write-Host "——————————Start cleaning QQ account: "$id" ——————————"
#调用方法:函数名+QQ号
cleanrubbish $id
cleanlog $id $TimeOutDays
Remove-Item $myQQfiledir\files -Recurse #删除通用的files目录
Remove-Item $myQQfiledir\$id\Msg3.0index.db -Confirm #删除消息记录索引数据库(可再生)
}
脚本的使用
调用ps1脚本的方法:powershell界面,进入脚本所在的目录,输入 <脚本名>.ps1
第一次跑powershell脚本,会遇到windows没有脚本执行权限的问题。这是因为系统默认是Restricted 执行策略,不允许任何脚本运行。
解决办法:管理员身份运行powershell,输入set-ExecutionPolicy RemoteSigned命令,重启。然后就能直接用了。
也可以在桌面右键ps1文件,选择用powershell运行。
跑出来的效果:提示目前正在清理的QQ账号,以及具体的文件夹作了何种处理(默认跳过空目录)。
问题更新(2022.4.11)
今天用脚本发现突然不行了,排查问题发现两点:
①定期清理功能的bug改好了
②有一些地方\打多了,拼接后会变成\\,影响路径引用。需要改一下这部分的细节。
以上就是今天的分享。
下次会针对安卓QQ出一个清理教程。