config.xml文件用于更新时检测是否有新的文件需要更新。本工具主要完成功能:读取一个给定目录,获得该目录下的所有文件信息(relativepath ,version,time,size...),并把所有文件信息存入config.xml.同时把该目录下所有文件复制到另外一个文件。
configGene.h
typedef struct FileInformation
{
QString path;
QString version;
QString checksum;
QDateTime time;
int size;
}FileInformation; 这个结构体用于存储遍历目录时获得的文件信息,要写入config.xml
typedef struct ImportInforMation
{
QString version;
QString appid;
QString siteid;
QString skinid;
QString language;
QString hold;
}ImportInforMation; 这个结构体用于读取Site.xml文件中的根节点信息,要写入config.xml 的根节点
class ConfigGene
{
public:
ConfigGene(QString &pathval, QString& relativePath, QString &configXmlPathval);
ConfigGene(QString &pathval);
~ConfigGene();
void setsiteXmlpath(QString Xmlpath); //设置site.xml 绝对路径
void setoutputXmlpath(QString outputpath); //设置output 路径
bool findFile(); //遍历目录
bool createConfigXml(); //生成 config.xml
bool readsiteXml(); //read site.xml
QString GetRelativePath( QString& strAbsoltPath, QString& basePath ); //获取相对路径
QString getfileMd5(QString filepath); //生成MD5值
static bool copyDirectoryFiles(QString &srcpath,QString &despath); //文件copy
private:
QString path; //需要遍历的目录
QString relativePath; //用于得到相对目录的基目录
QString siteXmlPath; //Site.xml 路径
QString configXmlPath; //config.xml 路径
QString outputpath; //复制所有文件的存储路径
QList<FileInformation> listFile; //存储文件信息的Qlist /* QList是一种表示链表的模板类。 QList<T>是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作。 由于QList在链表两端都预先分配了内存,因此实现prepend()和append()操作都很快。 QList以链表形式存储一组元素。默认为空链表,我们可以使用<<操作符添加元素: QList<QString> list; list << "one" << "two" << "three"; // list: ["one", "two", "three"] QList提供了一系列添加、移动、删除元素的操作:insert(), replace(), removeAt(), swap() 。此外,它还提供了便于操作的函数:append(), prepend(), removeFirst(), removeLast()。 at()操作比操作符[]更快,因为它不需要深度复制(deep copy)。 为了提高效率,QList的成员函数在使用前并不会验证其参数是否有效。除isEmpty()函数外,其它 成员函数都会假定该容器为非空容器;使用索引值(index)进行操作的成员函数都会假定其索引值参 数是在有效范围内的。这就意味着,QList在有些时候会出错。如果在编译时,我们定义了QT_NO_DEBUG ,编译过程中就不会检测这些错误。如果没有定义QT_NO_DEBUG,我们可以利用Q_ASSERT()或者 Q_ASSERT_X()加上一些合理的信息来实现错误检测。 */
FileInformation fileinfor; // push_back Qlist前临时存储文件信息
ImportInforMation importinfor; //存储site.xml的信
}; configGene.cpp //通过strAboltpath,basepath得到相对路径 QString ConfigGene::GetRelativePath( QString& strAbsoltPath, QString& basePath ){ //比较两个路径,如果前面的相同则使用basepath,如果不同则使用遍历目录 // QString 转 string 使用toStdString .string 转 char * 使用c_str
if( strncmp( strAbsoltPath.toStdString().c_str(), basePath.toStdString().c_str(), basePath.toStdString().length() ) == 0 ){std::string str;