上周用了约2天时间做了一个文件夹同步服务,后来没有用上,放在这里,供大家交流。
源代码和可执行文件下载见楼下。
目的:实现多个机器之间文件的自动同步
 
起因:在多个客户端程序的应用环境下,当其中某客户端修改其页面文件或者配置文件,其它客户端需要得到实时自动更新,而不是手动的复制文件。
 
分析:基本上有两种思路,对称和不对称实现,即采用基于服务器模式,和基于广播的模式,基于广播的模式更简单,更通用,因此采用。
 
实现逻辑:
                启动时发广播,收到对端的某一个PanSyncFile对象,然后调用该对象的GetFileInfos(),update到本地; 
                当检测到本地文件有改变时,广播通知其他服务,向本机同步文件;
 
编程环境:Qt4.8 + Ice3.4分别作为GUI和通讯库;
 
最终版本:实现原定的基本目的, 但有两个小问题:
                    1、文件夹改名后,同步到其它机器时,会多出一个文件夹,原因是采用QFileSystemWatcher,源文件夹没有发出directoryChanged信号;
                    2、文件大小没有实现断点处理,这样整个文件的大小依赖于配置,比如8012K;
                    3、由于某些原因,该项目最终没有用上,上面的两个小问题还是比较好处理的,但未处理;
 
总结:希望通过这个小程序,熟悉Qt、Ice的协作、应用。
 
接口文件:程序逻辑简单清楚,实现也就300行代码左右。
//********************************************************************** 
//
// Copyright (c) 2009-2012 PANS,All rights reserved.
//
// 作者: 麦盲
//创建日期:20012-05-23
//
// 更新日期:20012-05-23
//
//**********************************************************************
#ifndef PANSyncFile_ICE
#define PANSyncFile_ICE
/**
 *
 *实现逻辑:启动时发广播,收到对端的某一个PanSyncFile对象,然后调用该对象的GetFileInfos(),update到本地;
 *当检测到本地文件有改变时,广播通知其他服务,向本机同步文件;
 **/
modulePANS
{
    sequence<byte> ByteSeq;
    //定义文件信息;
    structDxFileInfo
    {
        boolisdir;
        int sign;
        int modifiedTime;
    };
    dictionary<string, DxFileInfo>DxFileMap;
    //定义文件内容信息;
    struct DxFileContent
    {
        int bytesLeft; //剩余字节;
        intmodifiedTime; //文件修改时间;
        ByteSeq contents;//本次内容;
    };
    /**
     *
     *文件服务接口,供对方同步文件;
     *
     **/
    interface PanSyncFile
    {
        //返回this对象;
        void reply(PanSyncFile*obj);
        //返回本地文件信息列表;
        DxFileMapGetFileInfos();
        //返回本地文件的内容
        DxFileContent GetFileContent(stringname);
    };
    /**
     *
     *广播发现接口
     *
     **/
    interface PanDiscover
    {
        //查找对方的文件服务,当启动时调用;
        void lookup(PanSyncFile*replyHere);
        //广播自己,当检测到本地文件有改动时;
        void update(PanSyncFile*obj);
    };
};
#endif