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