一开始就怀疑如果QQ崩溃或者聊天窗口非正常关闭的话,聊天记录是不会保存到磁盘上的。后来为了验证这个想法做了一个不严谨的观察,当时结果是只要收到消息,消息就会立刻写入磁盘。得出这点结论的原因有二,其一QQ的磁盘IO操作极其频繁,虽然我的群很多,而且很多群都设置为只接收消息而不显示,但使用Windows版本的QQ时却没有发现磁盘IO操作如此频繁,Linux下不知道QQ在搞什么飞机,观察 ~/.tencent/qq/号码 目录下面的文件变化情况,可以发现User.db文件修改非常频繁,IO操作应该就是针对这个文件的。其实仔细一点观察的话还会发现,QQ似乎不是仅仅是修改这个User.db文件,而是将整个文件读进内存,删除磁盘上的文件,修改内容之后再重新把整个文件写入磁盘。这个文件似乎是保存聊天记录的文件,日子久了这个文件就有几兆这么大了。把整个文件读出然后重写,虽然现在的电脑速度很快了,但也不能这样毫无节制的使用吧。就是因为这个磁盘IO非常频繁在加上猜测这个文件是保存聊天记录的,于是当时我就作出了只要收到聊天记录QQ就会把聊天记录写入磁盘的结论。
但是QQ实际表现似乎和这个结论不符,如果某次聊天窗口没有正常关闭,下次打开聊天窗口查看聊天记录时,并不会显示上次聊天窗口非正常关闭时候的聊天记录。这个现象使偶怀疑麻花疼是不是真的把消息即时写入磁盘,会不会是在关闭窗口时才写入磁盘?于是,偶重新进行一次更为严谨的观察实验。
首先去申请了一个新号码,把我正在使用的号加为好友,这样这个号上只有一个人,不会有来自其他人或者其他群的消息影响测试。于是,测试开始……
- 使用现在的号给新号发一条消息,新号的图标闪动,这时候观察到User.db的最后访问时间并没有变化。
- 单击新号闪动的图标,弹出消息盒子,这时候User.db的最后访问时间还是没有变化。
- 单击消息盒子中的消息,打开了聊天窗口,消息也显示出来了,但是User.db的最后访问时间还是没有变化。
- 关闭聊天窗口,User.db的最后访问时间变成了当前时间。
于是得知,聊天记录果然是在关闭聊天窗口的时候才保存的!这真是太糟糕了。
那么不关闭聊天窗口而直接退出QQ,聊天记录会不会保存呢?
- 再发了一条消息,打开聊天窗口,User.db的最后访问时间和预计的一样没有发生变化。
- 不关闭聊天窗口,直接右击QQ图标,选择“退出”,聊天窗口自动关闭,QQ退出。User.db的最后访问时间没有变化。
这更糟糕了!如果不手动关闭聊天窗口就退出QQ的话聊天记录根本不会保存!
于是我的聊天记录都不知道损失了多少了!果然腾讯这东西完全不能依靠啊,还是必须开发自家用的即时通讯工具才行。
不过这个关闭QQ的测试并不完全,应该再测试一下直接点击关闭按钮而不使用右键菜单退出会不会保存聊天记录的,偷工减料了。
另外,如果掉线,QQ会弹出一个提示框,点击确定以后,QQ会自动退出,这时候聊天记录显然也不会保存。如果正和某人商量某事到一半的时候正好掉线,好,恭喜你之前的讨论记录全都没有了,真是非常有利于信息安全啊。更安全的是,LinuxQQ的掉线频率非常高,只要网络有一点点不稳定,直接掉线没话说,偶怀疑是不是QQ和服务器只要通讯中断就立刻当作掉线,而不会多尝试几次重连。
假死就更不用说了,QQ三天两头假死的正常的,假死以后就只能杀死进程了,于是聊天记录又华丽丽地“和谐”掉了。
另外说个无关的问题,有一天我的QQ连续开了一个白天,然后偶看系统监视器,QQ的物理内存占用竟然达到170多MB,哎呀怎么看起来这么像内存泄漏呢?
F-22's Trace
greensea 的个人主页
sky-city
极夜奁
小樱之町
其实我更想知道这个体文件到底是用什么格式保存的?在windows下是用的复合文档!有兴趣的加QQ597622263
至少我只知道W和L下的聊天记录文件名虽然相同,但是却不可通用。
其实我现在换成eva了,比官方的好多了,唯一不方便的地方就是不能传文件,但是小文件可以发邮箱,大文件可以传FTP,基本上也没什么了。
呃,QQ保存聊天记录只能保存最新的几条吧。。
难道只是因为没显示出来?或者出新版本了?
偶觉得应该是只显示最近几条,但是记录还是保存下来了的说,因为User.db会越来越大的说