小工具:Everybackup

五年前的这个时候(2010年12月7号),某人本着天下无贼的思想把电脑带去了演出礼堂,用实际行动证明了天下无贼是不成立的(那个时候世界上还没有nozuonodie这个词)。损失包括并不仅限于一年的和某人的聊天记录,导致这段时间由于后来的强行删除记忆而永远成了断片;以及正在开发的约万行LibCHD及相关项目,导致本人月流水万元的游戏辅助工作室直接倒闭。

在此之后,关于如何备份代码(或者别的重要文件)的问题一直很困扰,直接打包会有一堆无用的文件(比如Debug/Release目录、IntelliSense数据库),浪费时间和空间。

后来发现WinRAR、7zip可以写通配符的文件列表,如*.cpp *.vb这样,也可以写排除列表,例如*\Debug\*,这样用了一段时间,发现了个问题——有些我fork下来编译的类库我并不需要备份,因为这些不是『我的』代码。

好吧,rar和7z都可以写排除列表。可是排除列表只有一个,而这种项目有时藏得很深。最好是能有一个能在每目录里建个配置文件什么的来说明这个目录下哪些需要备份哪些需要排除,类似apache的.htaccess。这个并不复杂,想了下就用批处理写了个枚举每个目录下的include和exclude文件然后汇总成全的include和exclude交给winrar。

这样又用了一段时间,又发现两个问题。第一,假如父目录默认排除了*.exe,而某个子目录需要包含*.exe(例如一个做pediy的项目),那么实测子目录的包含不能生效。第二,winrar对目录的扫描会花费很多时间。

第一个问题是集合运算的逻辑题,严格按照父目录——子目录的顺序求并集(包含)和差集(排除)即可解决。第二个问题,想到咱做程序的必备Everything搜索,用Everything索引好的列表想必应该很快。

于是研究了一下写出此工具。用法很简单,在任意需要备份的目录中建立列表文件backup.lst,写上需要包含和排除的文件名或通配符。软件会调用everything找出全盘所有的backup.lst,然后再根据里面的通配符再次调用everything找到符合要求的文件。并利用.NET 3.5 LINQ的集合运算最终生成备份文件列表喂给winrar。

由于everything的专业性,建表速度比winrar自己扫描要快很多。目前的代码筛选我的Projects目录各种文件类型只要4秒,而winrar自己的方案要10秒以上。主要瓶颈似乎是与everything主窗口IPC通信,如果改成异步并行可能会更快。

目前测试正常。代码和release目前都在github上,欢迎试用或改造。https://github.com/gmsj0001/Everybackup

 

Leave a Reply

Your email address will not be published. Required fields are marked *