文件打包代码更新 使用json记录打包文件信息

经过之前的几次试验 决定使用json记录打包文件信息

#include "Package.h"

#include "json/json.h"

#include <string>

#include <iostream>

/**************************************************************

技术博客

http://www.cnblogs.com/itdef/

 

技术交流群

群号码:324164944

 

欢迎c c++ windows驱动爱好者 服务器程序员沟通交流

**************************************************************/

bool Package::CreatePackage(const char* packFileName) {

    bool bRet = false;

    fpPackage_ = fopen(packFileName,"wb+");

    if (NULL == fpPackage_)

        return bRet;

    bRet = true;

    return bRet;

}

void Package::AddFileToList(const char* fileName) {

    fileList.push_back(fileName);

}

bool Package::OpenPackageForUnPack(const char* packFileName) {

    if (NULL != fpPackage_)

        fclose(fpPackage_);

    fpPackage_ = fopen(packFileName, "rb");

    if (NULL == fpPackage_)

        return false;

    return true;

}

bool Package::CopyFileContent(FILE* src, FILE* dsc) {

    char* buf = new char[CopyBufSize];

    if (NULL == buf)

        return false;

    while (1) {

        int nReadBytes = fread(buf,1, CopyBufSize, src);

        //写入包裹

        fwrite(buf, 1, nReadBytes, dsc);

        //如果读取到的数据比缓冲区小,那么说明读取结束了

        if (nReadBytes < sizeof(buf))

        {

            break;

        }

    }

    //fflush是确保我们的数据写入到磁盘上了

    fflush(dsc);

    return true;

}

bool  Package::PackageOneFile(const char*name)

{

    bool bRet = false;

    FILE* fp = fopen(name, "rb");

    if (NULL == fp)

    return bRet;

    //获取文件长度

    _fseeki64(fp, 0, SEEK_END); //定位到文件末

    __int64 filelength = _ftelli64(fp);

    _fseeki64(fp, 0, SEEK_SET);

    //获取PACKAGE文件当前偏移

    __int64 currentOffset = _ftelli64(fpPackage_);

    //开始打包

    CopyFileContent(fp, fpPackage_);

    FILEINFO fileInfo;

    fileInfo.filename = name;

    fileInfo.fileSize = filelength;

    fileInfo.offsetInPackFile = currentOffset;

    fileInfoList.push_back(fileInfo);

    fclose(fp);

    return bRet;

}

bool Package::GetUnpackFileInfo() {

    fileInfoList.clear();

    __int64 jsonOffset = 0;

    fread(&jsonOffset,1,sizeof(jsonOffset), fpPackage_);

    //获取文件长度

    _fseeki64(fpPackage_, 0, SEEK_END); //定位到文件末

    __int64 filelength = _ftelli64(fpPackage_);

    _fseeki64(fpPackage_, 0, SEEK_SET);

    _fseeki64(fpPackage_, jsonOffset, SEEK_SET);

    char* jsonBuf = new char[filelength - jsonOffset];

    if (NULL == jsonBuf)

        return false;

    fread(jsonBuf,filelength - jsonOffset,1, fpPackage_);

    //解析json字符串

    Json::Reader pJsonParser;;

    Json::Value tempVal;

    if (!pJsonParser.parse(jsonBuf, tempVal))

    {

        std::cout << "parse error" << std::endl;

        delete[] jsonBuf;

        return false;

    }

    Json::Value array = tempVal["array"];

    for (int i = 0; i < array.size(); i++) {

        std::cout << array[i]["Filename"].asString() << std::endl;

        std::cout << array[i]["FileSize"].asInt64() << std::endl;

        std::cout << array[i]["Offset"].asInt64() << std::endl;

    }

    delete[] jsonBuf;

    return true;

}

bool Package::WriteFileInfoToPackFile() {

    //获取PACKAGE文件当前偏移 写入JSON文件信息的偏移

    __int64 currentOffset = _ftelli64(fpPackage_);

    //生成JSON

    Json::Value root;

    Json::Value array;

    Json::FastWriter writer;

    Json::Value fileInfo;

    for (std::deque<FILEINFO>::iterator it = fileInfoList.begin();

        it != fileInfoList.end(); it++) {

        fileInfo["Filename"] = it->filename;

        fileInfo["FileSize"] = it->fileSize;

        fileInfo["Offset"] = it->offsetInPackFile;

        array.append(fileInfo);

    }

    root["array"] = array;

    

    std::string s = writer.write(root);

    //写入文件信息

    fwrite(s.c_str(),1,s.size(), fpPackage_);

    //跳转到文件头 写入JOSN偏移

    _fseeki64(fpPackage_, 0, SEEK_SET);

    fwrite(&currentOffset,1,sizeof(currentOffset), fpPackage_);

    fflush(fpPackage_);

    return true;

}

bool Package::PackFile() {

    bool bRet = false;

    //预留 打包文件的信息的偏移位置

    __int64 jsonOffset = 0;

    fwrite(&jsonOffset, 1, sizeof(jsonOffset), fpPackage_);

    for (std::deque<std::string>::iterator it = fileList.begin();

        it != fileList.end(); it++) {

        std::string fileName = *it;

        PackageOneFile(fileName.c_str());

    }

    fileList.clear();

    WriteFileInfoToPackFile();

    return bRet;

}

打包文件格式如下

文件信息格式类似

代码运行结果

具体代码见

http://www.oschina.net/code/snippet_614253_56938

时间: 2024-10-11 23:14:35

文件打包代码更新 使用json记录打包文件信息的相关文章

requirejs 多页面,多js 打包代码,requirejs多对多打包【收藏】

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.qdmm.c

[转] 三种Python下载url并保存文件的代码

原文 三种Python下载url并保存文件的代码 利用程序自己编写下载文件挺有意思的. Python中最流行的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法requests. 来看看三种方法是如何来下载zip文件的: import urllib import urllib2 import requests url = 'http://www.blog.pythonlibrary.org/wp-c

nginx日志不记录静态文件访问和缓存

nginx访问日志nginx和apache的访问日志一样可以记录的指定信息,如记录服务器时间,访问的客户端ip.访问的url和访问状态码等信息,这些信息会规律的记录到访问日志中主配置文件中定义的日志格式,记录的格式参数解释如下 $remote_addr ? ? ? ? ? ? ? ? ? 客户端访问IP(公网IP) $http_x_forwarded_for ? ? ? ? ? 记录代理服务器的IP $time_local ? ? ? ? ? ? ? ? ? ? 日志中服务器本地时间 $host

记录详细错误信息

utils.ToLog.WriteLog(AboutConfig.LogPath, "\r\n方法:" + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + "[##本地##文件不存在]\r\n导致异常的应用程序或对象名称:" +

建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

我们的思路是每天下班后团队各成员在指定的时间(例如下午18:30)之前把各自的代码上传到SVN,然后服务器在指定的时间(例如下午18:30)更新代码.执行ant 打包命令.最后将apk包存放在指定目录(或者上传指定ftp目录).其他部门或者同事可以访问指定的地址来下载最新的APK包.就是在ubuntu系统中创建一个定时任务,这个任务每天会在指定时间执行事先编写好的编译脚本.这个定时任务在ubuntu中可以使用crontab来实现.(还不了解crontab的同学自行脑补啦) 一.环境准备 1.在u

Web API删除JSON格式的文件记录

Insus.NET的系列Web Api学习文章,这篇算是计划中最后一篇了,删除JSON格式的文件记录.前一篇<Web Api其中的PUT功能演示>http://www.cnblogs.com/insus/p/4346982.html中学习了怎样更新数据.程序开发涉及到数据的,为了让用户方便管理,一般提供了查询,添加,更新以及删除功能.本篇中是针对文件中的数据进行删除. 下面Insus.NET就对此进行详尽演示.Web Api的一个type: "DELETE".在API控制中

webpacck打包完react后引入到html文件中报错:Target container is not a DOM element...

手动写了一个react程序,用webpack打包后生成了一个bundle,js文件,然后引入到index.html文件夹后,在浏览器打开该html文件,报错Target container is not a DOM element,一直找原因发现是引入bundle.js的顺序不对,应该放在div元素的下方,下面具体看代码 react相关js内容 var React = require('react');var ReactDom = require('react-dom');const eleme

characterCustomezition的资源打包代码分析

using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; class CreateAssetbundles { // This method creates an assetbundle of each SkinnedMeshRenderer // found in any selected character fbx, and adds any materials that

[Head First Python]6. 定制数据对象:打包代码与数据

相同功能,演进实现 数据文件 sarah2.txt sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55 1- 返回dict return({'Name':data_list.pop(0), 'DOB':data_list.pop(0), 'Time':str( sorted( set([sanitize(t) for t in data_list] ) )[0:3])}) 1 def sanitize(time