发布Gornix Synchronizer

来源:互联网 发布:苹果老司机软件 编辑:程序博客网 时间:2024/04/29 09:23

断断续续写了两三个月(貌似吧),终于写得有个样子了,经过了一阵子的测试,打算发布这个“最初版本”,并check in svn。所以此文读者正好赶上了我的“新闻发布会”。

 

程序主界面:

背景

 

很早很早以前,我的电脑中了一次攻击,所有分区丢失,那个叫惨啊,什么数据都没了,幸亏IT我还懂一点,后来我使尽了九牛二虎之力把除了C盘外的分区全部挽救了回来,C盘的部分数据也得以恢复。从那以后我就很清楚知道备份的重要,硬盘可以再买,系统可以再装,可数据是唯一的话就千金难买了。我的电脑里有我这10年来写的大量的文章,收集的大量的音乐和资料,还有大量的程序,嗯,还有照片(当然不是艳照了,别想歪了),丢失了我真不知道怎么办,所以后来就买了个移动硬盘把这些东西备份了起来,但单纯的手动拷贝备份是件麻烦的事情,比如很多很多的临时文件,是不应该备份的,白占空间,很多已经备份的文件,是不需要重新拷贝的,不然浪费时间,再有就是我有一些目录需要备份,一些不需要,每次都这么操作比较麻烦,还容易搞错,所以打算自己弄一个程序来做这个备份工作。

 

其实这样的程序已经有很多了,甚至连微软都出了一个,叫“SyncToy 2.0”,有兴趣的话可以自行搜索一下,我就不多列举了,但这些软件总是有它们本身的缺点,不怎么适合我用,或者没有过滤过能,或者运行速度太慢,或者会产生一些临时文件(不够绿色),或者需要注册,或者操作太过繁琐,功能太过繁杂……于是我打算自己写一个。

 

关于名字

 

写之前我征求了一些朋友的意见,给这个未出生的孩子起个名字,先打算叫Folder Sync,搜索一下发现已经有这么个程序了,或者叫Giant Copy(大力士),朋友又说名字太土,或者叫“超级备份”,连我自己都觉得土,总之好的名字都被别人用了,留下来的都不咋样,看来只能用专有名词了——Gornix Synchronizer

 

Gornix是什么意思?专有名词,以前我从来没跟别人提起过,这又是一段历史……那是我上大学的时候,当过相当长一段时间的“愤青”,愤青其中有个特点就是憎恨霸权,在IT界里,谁是霸权?那还用说么?微软啊,几乎垄断了所有的个人电脑的OS市场,正好当时还有个活跃分子方兴东扬言“起来,挑战微软的霸权”,所以提起Windows我就来气,但又不得不用,如何摆脱Windows?当然是要学会用别的OS了,Unix是个不错的东西,装到电脑上,学会了怎么用就可以把Windows踢出电脑了,谁叫那该死的比尔盖茨老说我们中国人素质低,用他的盗版,再说吧,我在Unix系统下运指如飞的模样,一定令身边的人无比敬佩吧,COOL!(在场的别笑,我当时比较无知嘛)。所以发明了Gornix这个词,也就是我的名字Guogang,加上Unix,当然了,很多词用久了意义上就发生一些的变化,这是很普遍的,Gornix后来也就成了我的电脑的名字,后来我再买电脑,都叫Gornix了,跟Unix其实没什么联系了,因为Gornix上没有Unix……

 

关于Logo,我把它设计成红蓝箭头的样子,比较直观,显眼。

 

功能

 

我想如果这个东西没有比其它同类软件更好的功能的话,我还是别弄了,所以在功能设计时候,我也是颇费工夫,我研究了五个拷贝方式,分别是Light CopyUpdate CopyCopyAbsolute CopySynchronizeLight Copy是轻度拷贝,只拷贝目标路径不存在的文件,对已有文件不作任何改动;Update Copy是更新拷贝,只复制比较新的文件(用日期判定)到目标路径;Copy就比较类似正常的拷贝,不同的文件都拷贝;Absolute Copy是绝对拷贝,除了拷贝之外,还把目标路径中存在的而源路径中不存在的文件/目录删除,使得目标和源“绝对”一致;最后就是Synchronize了,也就是同步,相当于源对目标的Update Copy,再加上目标对源的Update Copy,两次Update Copy。我想这五种方式足够应付绝大多数的情况了,另外还可以设置一些文件包含,文件过滤以及文件属性处理等,我能用到的功能都实现上去了。说实在我还是比较满意的。:)

 

五种拷贝方式:

开发花絮

 

框架:我一开始打算用WTL模板,但后来想想其实WTL也不算什么好东西,方便不去哪里,拿到别的环境去编译可能还得去下个WTL,干脆就不用吧。MFC?算了,这东西烦,效率且低。所以我打算自己突破自己一次:直接用pure Win32 API编写。

 

环境:开发环境选用的还是VC6,老原因:VC2005太慢了,速度速度,还是速度!不过VC6也有不好的地方,由于它自带的SDK是老的,我不得不去下载新的SDK安装,否则一些函数没法用。

 

界面:用纯API写程序一个大难题就是界面,这次我是一点点画上去的,用GDI,非常不容易,但也正好让我比较彻底地复习了一遍GDI。前几天我把我的程序给别人试用,有人说显示有问题,我要了截图,发现自己画的“状态栏”显示不出来,后来知道如果Windows的标题栏调宽(可以在控制面板的显示属性中调整)了之后就可能有这个问题,之后做了修正。总之我大量的时间都花在界面上了,设计一个好的界面真是不容易,也许很多人认为功能重要,界面不重要,其实不然,我问你,你认为Linux的功能比Windows差么?那什么是阻碍它普及的最大的障碍?当然是界面,我们已经完全习惯了Windows的界面了,虽然这不是全部原因。我认为界面也软件很重要的一部分,可能这也是梁肇新先生所说的“程序”和“软件”的重要差别(见梁肇新的《编程箴言》)。

 

还是界面:界面除了负责收集用户的输入信息之外,还需要向用户反映运行情况,还要防止用户有意无意的输入错误。比如试图把“D:/bakup”备份到“D:/bakup/bak”,这明显是不行的,不做检查的话会导致不可预料的后果,如何防止这种错误?再如果用户输入时候习惯性地在字符串前后多加了一些空格呢?对于不同的使用习惯,有些用户喜欢在目录名之后加反斜杠(/),有些则没这个习惯,是不是也应该考虑?在配置文件过滤时候,如果用户指定了“*; *.bmp; *.mdb”这样的字符串,那么是不是应该把*.bmp*.mdb剔除?因为*已经包含了所有的文件了,这需不需要考虑?所以我说一个优秀的软件,是基于对细节的充分考虑的,而不是某些人老说的什么“架构”。

 

效率:如果用过,你会发现这个程序的运行速度很快,因为它没用什么复杂的架构,没有什么垃圾代码和不必要的开销,我甚至考虑用HeapAlloc之类的API来取代C Librarynew运算符,但后来想到检测内存泄漏的问题只好作罢。效率的改进很大程度上也是一些很微妙的细节,比如目录遍历时候,我用的不是递归,而是自己写了一个高效的链表,我还适当调整过变量的定义位置来减少不必要的初始化等,尽管这些改进单独看来微不足道,但作为一个软件人,我想我应该尽力而为。

 

依赖:最小依赖一直是我的追求,所以我以前用MFC的时候,用的一般都是静态库,我这个程序目前看来只依赖6DLL,其中3个是Windows核心库,这些DLL都是目前的Windows版本必带的,不会存在缺库的问题。

依赖关系:

 

绿色软件:真正做到不污染系统,不会在注册表写入任何信息,不会在Windows系统目录下写入任何信息,除了会在程序目录下生成一个Log文件之外,就不会产生任何增加磁盘使用的垃圾文件,而且,只需要一个exe文件就能运行,不需要安装,体积很小,用UPX等工具进行加壳后,才100K

 

后继

 

我还可以改进它,比如让它支持网络文件夹同步。我接下去是想研究搜索引擎技术,这绝对是个大工程,我当然不可能企图一步登天,现在只是构想阶段。

 

csdn.net的blog不支持文件上传,如果谁需要可以告诉我,我email过去。有问题还可以联系我。

 

[20080515编辑]我已经把文件上传到网络硬盘,有兴趣的可以通过这个链接下载,曾经想把软件放在华军软件园,无奈那些家伙不理我,没办法。

 

http://www.isload.com.cn/myfile/download/xqi2yf2jtfu27/GornixSync.rar

 

我的emailguogangj@163.com

 

Gornix Synchronizer V1.00

Release date: Apr. 23th, 2008.

原创粉丝点击