• 7580阅读
  • 3回复

工业自动化软件设计 之十一  文件夹同步服务器的分析、实现:一个小项目的编写思路 [复制链接]

上一主题 下一主题
离线myer
 

只看楼主 倒序阅读 楼主  发表于: 2012-05-28

上周用了约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
http://user.qzone.qq.com/56430808
离线myer

只看该作者 1楼 发表于: 2012-05-28
源代码下载: syncfile_src.rar (8 K) 下载次数:41
可执行文件下载: syncfile_bin.rar (72 K) 下载次数:21

若运行可执行文件,请安装Qt4.8.0和Ice3.4.2.
http://user.qzone.qq.com/56430808
离线muqiujuan
只看该作者 2楼 发表于: 2012-05-28
挺有意思!
离线hui_20001

只看该作者 3楼 发表于: 2012-11-21
回 2楼(muqiujuan) 的帖子
非常感谢,正在寻求相互协作的实例那
快速回复
限100 字节
 
上一个 下一个