上周用了约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