精华内容
下载资源
问答
  • 本人刚刚接口,只学习过C#语音 有没有带注释的代码,或是关于接口的帮助文档 分享给我,谢谢各位大佬
  • VS实现rar格式压缩包的解压详解

    千次阅读 2018-08-07 17:02:24
    最近做到的项目世关于程序更新的,用到从服务器下载安装包,从服务器下载的安装包大多是...那么该怎么做呢?网上说了些采用第三方解压缩代码,不过我并没有这方面的想法,我查看了较多的资料,发现windows自带能够解压...

    最近做到的项目世关于程序更新的,用到从服务器下载安装包,从服务器下载的安装包大多是压缩包,所以这里稍微研究了下如何用代码实现压缩包的解压及相关绝对路径的问题.

    首先我来重现下我的目的:在这里我希望将桌面上得一个名为新建文件夹中的wget.rar的压缩文件解压当前文件夹

    那么该怎么做呢?网上说了些采用第三方解压缩代码,不过我并没有这方面的想法,我查看了较多的资料,发现windows自带能够解压的winrar.exe程序,可以通过system()函数类似shell命令行一样用语句调用winrar.exe程序.

    下面给出我的代码,代码内有详细注释

    #include<stdio.h>
    #include<windows.h>
    #include<tchar.h>
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
    	string rarPath = "C:\\Program Files\\WinRAR";//该路径为winrar.exe的默认文件路径
    	/*puts("填入你系统的WINRAR.exe所在目录:");
    	gets(rarPath);*/
    	SetCurrentDirectoryA(rarPath.c_str());//将进程的工作目录移动到该参数所指的目录下,该目录为winrar.exe的默认文件路径
    	//解压c:\1.rar到桌面新建文件夹目录里
    	char* lcm="rar  x  C:\\Users\\Administrator\\Desktop\\新建文件夹\\wget.rar  \"C:\\Users\\Administrator\\Desktop\\新建文件夹\\\"";
    	/*这里给出上面命令的详细说明*/
    	/*rar x 是格式,意思为用winrar.exe执行全部提取文件.后面的一个路径为你要解压的文件的绝对路径,
    	                               第四个即最后面的路径为你要讲压缩文件解压到的位置的绝对路径*/
    	printf("shell command line :%s\n",lcm);
    	system(lcm);
    	puts("解压完毕.");
    	return 0;
    }

    这里有几个重点:

    ①winrar.exe文件所在位置

    ②rar.exe的调用语句

    下面我说下这两点

    ①你可以通过我图片中的路径查看自己的winrar.exe所在位置(基本上都是默认位置)

    ②关于rar.exe的调用语句.可以看这篇博客https://blog.csdn.net/qq_37059136/article/details/81477813

    下面我展示下运行结果:

    首先这是运行前的文件夹

    运行界面

    这是运行后的文件夹

    可以看到成功解压!

    别看这段代码不长,里面有用的信息着实很多,尤其是system()函数的用法及rar.exe的用法!!!

    展开全文
  • 小弟菜鸟,现在在给客户一个java程序调用winRAR命令行,生成一个压缩包,供用户下载的功能。现在这个功能倒是完成了,但是有个问题,那就是如果需要添加进压缩包的附件比较大,比如说超过了5M,则winrar程序一直在...
  • 1 概述1.1 问题的提出不知道您在开发中碰到过这种情况没:在其他公司提供的平台上二次开发,但对方每次源码一有更新,都不是以patch包的形式给出,而是将整个工程打包过来,搞得大家每次都得加班来合代码。...


    1 概述

    1.1 问题的提出

    不知道您在开发中碰到过这种情况没:在其他公司提供的平台上做二次开发,但对方每次源码一有更新,都不是以patch包的形式给出,而是将整个工程打包过来,搞得大家每次都得加班来合代码。

    这种情况大家都怎么处理呢?我最早是这么做的:

    Ø 将我们做了修改的n个文件,从对方的压缩包中解压出来(记得 仍然保持这些文件的源码树结构,而不是将他们解压到同一个目录中)。假设解压到 new_version 目录中,记得将此目录做个备份 new_version_bak;

    Ø 用 Beyond Compare (或其他对比软件)将 new_version 与旧软件版本 做对比来合代码;

    Ø 合代码后,将 new_version 打包,发给其他开发人员,则对方只需解压该压缩包到源码树的根目录下就ok了,而不需要将这n个文件一个个做替换。如果项目采用cvs的话,也可以讲这个压缩包解压到cvs的根目录下。

    这三个步骤中,后两个步骤或许用机器 合软件 大家不放心,但第一个步骤纯粹是重复工作,修改的文件一多,工作量将相当可怕,最好是能交给计算机做。这个工作概括起来就是:

    前提:新版本压缩包 new_version.rar、旧版本中与对方提供的原始平台不同的文件以原先源码树的方式统一存放到 old_version 目录下;

    需求:将 new_version.rar 中与 old_version 目录下相同的文件提取出来,存放到 new_version 下。

    1.2 解决思路

    根据上面的需求,我们需要这么几个步骤:

    Ø 将 old_version 中的文件以绝对路径的方式列在一张表上,这个工作太适合让perl这种文本处理语言了;

    Ø 让 winrar 根据这张表解压对应文件,这也可以采用 winrar x new_version.rar @new_version.lst ;

    2 工具的使用

    为了完成上面的工作,我用perl语言和make写了个工具包,下面讨论下其用法。

    2.1 工具包含的文件

    该工具包需要用到 make、perl 等工具,包含的文件如下:

    机器上还必须有安装 perl 程序。

    Toolkit

    ├:make 工具

    │ ├libiconv2.dll

    │ ├libintl3.dll

    │ └make.exe

    ├:patch 工具

    │ ├make.bat

    │ ├Makefile

    │ └开发工具_patch工具的使用.doc:本文档

    └: perl 脚本,下面列出这些perl脚本的功能

    ├ls_dir.pl:以绝对路径列出指定目录下的文件和目录,类似于linux下的 ls 命令

    ├mk_dir.pl:新建目录

    ├replace_str.pl:以正则表达式的方式替换字符

    ├rm_dir.pl:删除目录

    └rm_file.pl:删除文件

    2.2 执行步骤

    真正的步骤只有两步:

    Ø make clean :清除patch/build 目录;

    Ø make :生成欲修改文件列表以及new_version 目录,它们均位于patch/build 下。

    但在执行这两步之前,我们必须先配置 make.bat 和 Makefile 两个文件。

    2.3 配置工作

    2.3.1 make.bat

    E:/Tech/Document/Tools/Toolkit/Make/make -r -R MAKESHELL=CMD %*

    请将 E:/Tech/Document/Tools/Toolkit/Make/make 修改为您PC上make工具存放地址。

    2.3.2 Makefile

    该文件一般有这么几个地方要改:

    PERL_DIR = E:/Tech/Document/Tools/Toolkit/Perl # 蓝色字体修改为上述perl脚本所在目录

    RAR_BIN = D:/Program Files/WinRAR/rar.exe # 蓝色字体修改为winrar程序所在目录

    PREV_VER_DIR = E:/Tech/Project/ Bak/old_version_bak # 蓝色字体修改为old_version 的绝对路径

    RAR_FILE = E:/Tech/Project/new_version.rar # 蓝色字体修改为new_version.rar的绝对路径

    STR_DST = new_version # 蓝色字体修改为压缩包里面的第一级目录名

    3 附录

    3.1 Perl 语言

    有兴趣的话,可以参考《Perl语言入门》。

    3.2 关于winrar

    大家都习惯于winrar压缩软件的图形界面操作,很多人都不知道它还有个 命令行模式(或称dos版吧)Rar.exe。下面列出patch工具用到的几条rar命令:

    常规的命令行语法描述如下:

    WinRAR <命令> -<开关1> -<开关N> <压缩文件 > <文件...> <@列表文件...> <解压路径/>

    添加压缩文件命令—a

    rar a test.rar 1.txt :添加 1.txt 到压缩包 test.rar中,若无test.rar,则新建它;

    添加压缩文件命令—a

    rar a test.rar 1.txt :添加 1.txt 到压缩包 test.rar中,若无test.rar,则新建它;

    添加压缩注释—c

    rar c –z2.txt test.rar :将 2.txt 作为 test.rar的注释;

    rar –z2.txt a test.rar 1.txt :上面两步的集合;

    解压命令—x

    rar x test.rar 1.txt :将1.txt从test中解压出来;

    将test.lst文件从test.rar中解压出来—@test.lst

    rar x test.rar @test.lst:

    关于 winrar 软件的其他方面可参考该软件目录下的 WinRAR.chm,winrar软件的命令和开关不区分大小写。

    4 联系方式

    希望这份文档对您有所帮助,若您发现任何问题或有任何更好的建议,欢迎与我联系!

    温陵布衣:

    MSN: sikinzen@hotmail.com

    Mail: sikinzen @yahoo.com.cn

    QQ: 526679213

     

     

    注:工具包请到我的共享下载:http://sikinzen.download.csdn.net/

    展开全文
  • 2.原文件夹内容已压缩打包,要求将分词组合功能单独剥离成工具,可以直接用的那种。 3.压缩包链接:https://pan.baidu.com/s/1VJCW5jVpfA1YhDT0BMwJ4w 提取码:ovld 4.原有功能选项界面示例图片 ![图片说明]...
  • 项目要求是能定时解压gz文件,并按照省将文件成一个大文件,代码实现功能:按照gz压缩包的路径格式解压文件,最后将文件合并成按照省份名称排放的大文件,项目用log4j记录日志,用Java定时器实现定时解压合并,并且...

    项目要求是能定时解压gz文件,并按照省将文件成一个大文件,代码实现功能:按照gz压缩包的路径格式解压文件,最后将文件合并成按照省份名称排放的大文件,项目用log4j记录日志,用Java定时器实现定时解压合并,并且删除解压出来的小文件,同时也删除解压目录下的压缩包,并将压缩包移动到已处理文件夹下(这么做是因为文件是定时下载到一个目录的,每次我们去这个目录下去处理文件,为了不重复解压合并已经处理过的文件,逻辑上我把处理过的文件都移动到一个已处理文件夹下,并且删除目录下的压缩包,这样就免去了记录跟判断文件是否是新文件的开销),下面直接上代码:

    附录里面回加上工程代码,到时候各异直接下载下来

    1)先看项目的配置文件(mergeFilleUtil.properties),log4j内容我就不贴了,一会儿自己下载看看就行:

    #原始文件

    PROVINCE_DIR=E:\\test\\rootfile

    #解压后文件存放的路径

    UN_ZIP_PATH=E:\\test\\unZip

    #合并后文件存放的路径

    OUT_PATH=E:\\test\\result

    #已经处理过的文件存放路径

    DONE_FILE_PATH=E:\\test\\doneFile

    #任务执行结束后哪些文件路径下的需要删除

    DELETE_PATH=E:\\test\\rootfile,E:\\test\\unZip

    #配置任务的时间间隔,以秒为单位,一天是:24*60*60*1000

    TASK_PERIOD=86400

    #任务开始的小时时间

    TASK_BEGIN_HOUR=9

    #任务开始的分钟

    TASK_BEGIN_MINUTE=26

    2)主程序入口:

    public static void main(String[] args) {

    Map proMap =  LoadProperty.readProperty();

    Timer timer = new Timer();

    MergeFileUtil mergeTask = new MergeFileUtil();//要执行的任务

    //任务的时间间隔,1000表示1秒

    long intevalPeriod = Long.valueOf(proMap.get("TASK_PERIOD").toString());

    //Calendar类封装了一系列操作date时间的方法

    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(calendar.YEAR);

    int month = calendar.get(calendar.MONTH);

    int day = calendar.get(calendar.DAY_OF_MONTH);

    //指定每天执行任务的小时跟分钟比如19点32分

    int hour = Integer.valueOf(proMap.get("TASK_BEGIN_HOUR").toString());

    int minute = Integer.valueOf(proMap.get("TASK_BEGIN_MINUTE").toString());

    calendar.set(year, month, day, hour, minute);

    //Calendar.getTime()方法返回Date类型的返回值

    Date date = calendar.getTime();

    System.out.println("运行时间:" +year+"-"+month+"-"+day+"-"+hour+"-"+minute);

    //指定定时任务的执行规则,调用定时任务。开始执行

    timer.schedule(mergeTask, date, intevalPeriod*1000);

    }

    }

    3)读取配置文件工具类:

    public class LoadProperty {

    private static Logger log = Logger.getLogger(LoadProperty.class);

    private static Properties prop;

    static{

    ClassLoader loader = LoadProperty.class.getClassLoader();

    InputStream in = loader.getResourceAsStream("mergeFilleUtil.properties");//此时仍然把资源装载近内存中了。

    prop = new Properties();

    try {

    //utf-8编码配置文件,防止中文路径出错

    prop.load(new InputStreamReader(in, "UTF-8"));

    } catch (UnsupportedEncodingException e1) {

    log.error("加载配置文件出错,请检查!");

    } catch (IOException e1) {

    log.error("加载配置文件流出错,请检查!");

    } finally{

    if(in!=null){

    try {

    in.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    }

    @SuppressWarnings("rawtypes")

    public static Map readProperty(){

    return prop;

    }

    }

    4) 多线程文件解压合并工具类

    public class MergeFileUtil  extends TimerTask{

    private static Logger log =  Logger.getLogger(MergeFileUtil.class);

    @Override

    public void run() {

    unZipFile();

    }

    //解压

    @SuppressWarnings("rawtypes")

    public void unZipFile(){

    //读取配置文件中的路径

    Map proMap =  LoadProperty.readProperty();

    String rootdir = proMap.get("PROVINCE_DIR").toString();

    String unZipPath = proMap.get("UN_ZIP_PATH").toString();

    String outDir = proMap.get("OUT_PATH").toString();

    File rootfile=new File(rootdir);

    if(!rootfile.exists()||!rootfile.isDirectory()){

    log.error("文件路径不存在,请检查欲解压的文件所在目录是否填写正确!");

    return;

    }else{

    File[] files=rootfile.listFiles();

    if(files.length==0){

    log.error("警告:没有要解压的文件!请检查:"+rootfile+"下是否存在需解压的文件!");

    }else{

    //分配解压线程池

    ExecutorService pool=Executors.newFixedThreadPool(files.length);

    for (File provinceDir:files){

    excuteThreads(pool,provinceDir,outDir,unZipPath);

    }

    pool.shutdown();

    while (true) {

    if (pool.isTerminated()) {

    //解压结束后启动合并线程池

    mergerFile();

    break;

    }

    try {

    Thread.sleep(200);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    }

    //解压类

    private  void excuteThreads(ExecutorService pool,File provinceDir,String outdir,String unZipPath){

    pool.execute(

    new UnZipFile(provinceDir.getAbsolutePath(),

    outdir,unZipPath));

    }

    @SuppressWarnings("rawtypes")

    private void mergerFile(){

    //读取配置文件中的路径

    Map proMap =  LoadProperty.readProperty();

    String rootdir = proMap.get("PROVINCE_DIR").toString();

    String unZipPath = proMap.get("UN_ZIP_PATH").toString();

    String outDir = proMap.get("OUT_PATH").toString();

    String doneFilePath = proMap.get("DONE_FILE_PATH").toString();

    String deletePath = proMap.get("DELETE_PATH").toString();

    String []deleteArray = deletePath.split(",");

    File unZipFile=new File(unZipPath);

    if(!unZipFile.exists()||!unZipFile.isDirectory()){

    log.error("文件路径不存在,请检查欲合并的文件所在目录是否填写正确!");

    return;

    }else{

    File[] files=unZipFile.listFiles();

    if(files.length==0){

    log.error("警告:没有要合并的文件!请检查:"+unZipFile.getPath()+"下是否存在需合并的文件!");

    }else{

    //分配线程池

    ExecutorService pool=Executors.newFixedThreadPool(files.length);

    for (File provinceDir:files){

    excuteMergerThreads(pool,provinceDir,outDir,unZipPath);

    }

    pool.shutdown();

    while(true){

    if(pool.isTerminated()){

    //合并结束后启动移动跟删除文件程序

    MoveAndDeleteFile  moveAndDeleteFile = new MoveAndDeleteFile();

    log.info("开始移动文件到已处理文件夹!");

    moveAndDeleteFile.moveFile(new File(rootdir),new File(doneFilePath));

    log.info("移动文件到已处理文件夹成功!");

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    log.info("开始删除文件!");

    for(int i=0;i

    File file = new File(deleteArray[i]);

    if(!file.exists()){

    log.error("欲删除的目录不存在,请检查目录:"+file.getPath()+"是否正确存在!");

    }else{

    moveAndDeleteFile.deleteFileAndDir(new File(deleteArray[i]),true);

    }

    }

    log.info("删除文件结束!");

    log.info("解压合并文件程序运行结束!");

    break;

    }

    }

    }

    }

    }

    //文件合并类

    private void excuteMergerThreads(ExecutorService pool,File file,String outDir,String unZipPath){

    pool.execute(new MergeFile(file.getAbsolutePath(),

    outDir,unZipPath));

    }

    }

    5)解压代码:

    public class UnZipFile implements Runnable {

    private static Logger log = Logger.getLogger(UnZipFile.class);

    private String outFilePath;        //合并文件输出目录

    private String mergeFileDir;       //原始文件存放目录

    private String unZipFileDir;       //解压文件输出目录

    private BufferedOutputStream bufferedOutputStream;

    public static final int BUFSIZE = 1024 * 8;

    private static int count;//计算器,记录文件解压个数

    public UnZipFile(){

    }

    public UnZipFile(String mergeFileDir, String outFilePath,String unZipFileDir) {

    this.outFilePath = outFilePath;

    this.mergeFileDir = mergeFileDir;

    this.unZipFileDir = unZipFileDir;

    }

    public void run() {

    File f=new File(outFilePath);

    File mergerDir=new File(mergeFileDir);

    if(!f.exists()){

    f.mkdirs();

    return;

    }

    try {

    log.info("开始解压路径:"+mergerDir+"下文件!");

    unzipFile(mergerDir,unZipFileDir);

    log.info("解压文件:"+mergerDir+"结束!");

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    private void unzipFile(File file,String OutFileDir) throws IOException{

    if(file.isDirectory()){

    for(File children:file.listFiles()){

    unzipFile(children,OutFileDir);

    }

    }else if(file.getAbsolutePath().endsWith(".gz")){

    count++;

    doUnZipFile(file, OutFileDir);

    //每五千个打印一次,用作程序提示

    if(count>0&&count%1000==0){

    log.info("已经解压"+count+"个文件!");

    }

    }

    }

    /*

    * 文件解压

    * zipFile:传入解压文件

    * outputDirectory:解压目的地路径

    */

    public void doUnZipFile(File zipFile,String outputDirectory) {

    FileInputStream fis = null;

    GZIPInputStream is = null;

    ArchiveInputStream in = null;

    BufferedInputStream bufferedInputStream = null;

    String separator = File.separator;

    //确定目的地解压的目录结构begin

    int lastIndex = zipFile.getPath().lastIndexOf(separator);

    int index = mergeFileDir.lastIndexOf(separator);

    String dirStructurePath=null;

    if(lastIndex<=index){

    dirStructurePath ="";

    }else{

    dirStructurePath = zipFile.getPath().substring(index+1, zipFile.getPath().lastIndexOf(separator));

    }

    //确定好目的地解压的目录结构end

    String dirPath=null;

    try {

    fis = new FileInputStream(zipFile);

    is = new GZIPInputStream(new BufferedInputStream(fis));

    in = new ArchiveStreamFactory().createArchiveInputStream("tar", is);

    bufferedInputStream = new BufferedInputStream(in);

    TarArchiveEntry entry = (TarArchiveEntry) in.getNextEntry();

    while (entry != null) {

    //要解压的文件以及其压缩包内的文件:包名称/包下文件名称

    String name = entry.getName();

    String[] names = name.split("/");

    //解压目的地目录

    String  dirRootPath;

    if(dirStructurePath==""){

    dirRootPath = outputDirectory;

    }else{

    dirRootPath = outputDirectory+separator+dirStructurePath;

    }

    for (int i = 0; i < names.length; i++)

    {

    String str = names[i];

    dirRootPath = dirRootPath + separator + str;

    }

    dirPath = dirRootPath.substring(0,dirRootPath.lastIndexOf(separator));

    File dirFilePath = new File(dirPath);

    if(!dirFilePath.exists()){

    dirFilePath.mkdirs();

    }

    if (name.endsWith("/")) {

    mkFolder(dirRootPath);

    } else {

    File file = mkFile(dirRootPath);

    bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));

    int b;

    while ((b = bufferedInputStream.read()) != -1) {

    bufferedOutputStream.write(b);

    }

    bufferedOutputStream.flush();

    bufferedOutputStream.close();

    }

    entry = (TarArchiveEntry) in.getNextEntry();

    }

    //log.info("解压文件:"+zipFile.getName()+"到: "+dirPath+" "+"完成!");

    } catch (FileNotFoundException e) {

    log.info("找不到要解压的文件所在路径!");

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    } catch (ArchiveException e) {

    e.printStackTrace();

    } finally {

    try {

    if (bufferedInputStream != null) {

    bufferedInputStream.close();

    }

    if(in!=null){

    in.close();

    }

    if(is!=null){

    is.close();

    }

    if(fis!=null){

    fis.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    private void mkFolder(String fileName) {

    File f = new File(fileName);

    if (!f.exists()) {

    f.mkdir();

    }

    }

    private File mkFile(String fileName) {

    File f = new File(fileName);

    try {

    f.createNewFile();

    } catch (IOException e) {

    log.error("文件"+fileName+"创建失败");

    e.printStackTrace();

    }

    return f;

    }

    }

    6)合并代码:

    public class MergeFile implements Runnable{

    private static Logger log = Logger.getLogger(UnZipFile.class);

    private String outFilePath;        //合并文件输出目录

    private String mergeFileDir;       //解压文件存放目录

    private static volatile  int count;//计算器,记录文件解压个数

    public static final int BUFSIZE = 1024 * 8;

    public MergeFile(String mergeFileDir, String outFilePath,String unZipFileDir) {

    this.outFilePath = outFilePath;

    this.mergeFileDir = mergeFileDir;

    }

    @Override

    public void run() {

    mergerUnZipFile();

    }

    private void mergerUnZipFile(){

    FileChannel outChannel = null;

    //合并解压目录下的文件

    File f = new File(mergeFileDir);

    String path = f.getPath();

    String outPath = outFilePath+path.substring(path.lastIndexOf(File.separator));

    if(!new File(outPath).exists()){

    new File(outPath).mkdirs();

    }

    try {

    //构造合并文件路径以及文件名

    File f2=new File(outPath+File.separator+"result");

    if(!f2.exists()){

    //若文件不存在,则新建

    f2.createNewFile();

    outChannel = new FileOutputStream(f2).getChannel();

    }else{

    //若文件存在,则在源文件后面追加新的内容

    outChannel = new FileOutputStream(f2,true).getChannel();

    }

    } catch (IOException e) {

    log.error("文件:"+outPath+File.separator+"result"+"不存在,请检查!");

    e.printStackTrace();

    }

    log.info("开始合并路径:"+f.getPath()+"下文件");

    mergeFile(f,outChannel);

    log.info("路径:"+f.getPath()+"下文件合并完成");

    if(outChannel!=null){

    try {

    outChannel.close();

    } catch (IOException e) {

    log.error("关闭管道流出错,请检查文件合并类下run方法的文件管道流!");

    e.printStackTrace();

    }

    }

    }

    /*

    * 用途:合并文件

    * file:存放文件的根目录

    * outFileChannel:输出文件管道流

    */

    public  void mergeFile(File file,FileChannel outFileChannel){

    if(file.isDirectory()){

    for(File children:file.listFiles()){

    mergeFile(children,outFileChannel);

    }

    }else if(!file.getAbsolutePath().endsWith(".gz")){

    mergeFiles(file,outFileChannel);

    //每五千个打印一次,用作程序提示

    count++;

    if(count>0&&count%50000==0){

    log.info("已经合并文件"+count+"个!");

    }

    }

    }

    public static void mergeFiles(File file,FileChannel outChannel) {

    try {

    FileChannel fc = new FileInputStream(file).getChannel();

    ByteBuffer bb = ByteBuffer.allocate(BUFSIZE);

    while(fc.read(bb) != -1){

    bb.flip();

    outChannel.write(bb);

    bb.clear();

    }

    fc.close();

    //log.info("合并文件"+file.getPath()+"完成!");

    } catch (IOException ioe) {

    log.error("合并文件:"+file.getPath()+"失败!");

    ioe.printStackTrace();

    }

    }

    }

    7)移动跟删除文件代码:

    public class MoveAndDeleteFile {

    private static int count;//计数器

    private Logger log = Logger.getLogger(MoveAndDeleteFile.class);

    /*

    * 用途:将文件从一个目录移动到另外一个目录

    * rootdir:存放原文件的根目录

    * rootBoo:为true时不删除根目录,只删除根目录下文件跟文件夹

    */

    public void moveFile(File rootdir,File doneFilePath){

    //开始移动文件

    if(rootdir.isDirectory()){

    for(File file:rootdir.listFiles()){

    moveFile(file,doneFilePath);

    }

    }else{

    moveTheFile(rootdir,doneFilePath);

    //每五千个打印一次,用作程序提示

    count++;

    if(count>0&&count%5000==0){

    log.info("已经移动文件"+count+"个!");

    }

    }

    }

    public void moveTheFile(File rootdir,File doneFilePath){

    FileInputStream fi = null;

    FileOutputStream fo = null;

    FileChannel in = null;

    FileChannel out = null;

    try {

    String currentFilePath = rootdir.getPath();

    //确定好目的地解压的目录结构begin

    int index = "E:\\test\\rootfile\\".lastIndexOf(File.separator);

    String dirStructurePath = doneFilePath+currentFilePath.substring(index);

    File dir = new File(dirStructurePath.substring(0, dirStructurePath.lastIndexOf(File.separator)));

    if(!dir.exists()){

    dir.mkdirs();

    }

    File dirFile = new File(dirStructurePath);

    if(!dirFile.exists()){

    dir.createNewFile();

    }

    fi = new FileInputStream(rootdir);

    fo = new FileOutputStream(dirStructurePath);

    in = fi.getChannel();//得到对应的文件通道

    out = fo.getChannel();//得到对应的文件通道

    in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道

    //System.out.println("移动文件:"+rootdir.getPath()+"完成!");

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    try {

    fi.close();

    in.close();

    fo.close();

    out.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    /*

    * 先删除文件再删除文件夹

    * file:存放文件的根目录

    * rootBoo:为true时不删除根目录,只删除根目录下文件跟文件夹

    */

    public  void deleteFileAndDir(File  file,boolean rootBoo){

    String rootDir = null;

    if(rootBoo){

    rootDir = file.getPath();

    }

    File []files = file.listFiles();

    for(int i=0;i

    if(!files[i].isDirectory()){

    files[i].delete();

    //每五千个打印一次,用作程序提示

    count++;

    if(count>0&&count%50000==0){

    log.info("已经删除文件"+count+"个!");

    }

    }else{

    deleteFileAndDir(files[i],false);

    }

    }

    //不删除存放文件的根目录

    if(rootDir!=file.getPath()){

    file.delete();

    }

    }

    }

    8)代码运行分析结果:

    代码测试了两个省共15G的压缩包,解压后三十万个小文件,从解压、合并、移动、删除整个流程耗时共3个小时,合并后的文件大小共40G,效率上看还可以

    9)注意事项

    解压跟合并必须做成多线程启动的,每个省的解压跟合并都分配一个线程,代码里面用了Java线程池,在分配线程池数量前线计算一共有几个,按照省数量分配,代码里面在

    上面第四点:多线程文件解压合并工具类里面有体现。

    10)项目的配置文件我放在代码里面一同放在了附件,代码有不当之处欢迎指点,大家共同学习进步。用到的jar包我也在项目里面直接上传了,下载下来就能看到。

    项目的百度网盘路径:http://pan.baidu.com/s/1c0vYUJI,复制直接下载即可

    展开全文
  • 从网上找到一个日期组件例子,但是不怎么好用,我又进行了二次封装。压缩包中有个DateDemo.java的演示程序;JDateField就是源代码了。代码中都写有注释,各位可以自己再更改。
  • 客户端的代码大家可以再网上找找,有好多.OpcTools.exe是opc客户端工具.本压缩包中的所有资源均是免费的,可无限制使用.这个例子只写了opcserver的基础部分.大家可以自己修改和完善(重要的部分已经写在例子中了). 一、...
  • iOS开发的朋友们经常会用到终端来下载和管理第三方的类库,所以了解常用的命令行必不可少,下面简单介绍一下,怎么利用命令行实现将本地项目代码上传到GitHub上。 1.首先你要拥有GitHub的账号,注册地址:...

    做iOS开发的朋友们经常会用到终端来下载和管理第三方的类库,所以了解常用的命令行必不可少,下面简单介绍一下,怎么利用命令行实现将本地项目代码上传到GitHub上。

    1.首先你要拥有GitHub的账号,注册地址:https://github.com/join?source=header

    2.准备好准备上传的项目,放置桌面(其他位置也可),文件夹即可不用打包成zip压缩包。(上传前可以备份一下,以防出现莫名的意外)

    3.打开终端,运行

    cd /Users/sunzhaokai/Desktop/SaveImage

    (/Users/sunzhaokai/Desktop/SaveImage为从桌面拖入的准备上传的项目文件夹) ,然后回车(每次执行完命令均需要回车一下)

    4.建立本地仓库

    git init

    5.将项目中的所有文件添加到本地仓库中

    git add .

    如果想添加某个特定的文件,只需把 . 换成特定的文件名即可(同样将文件拖入即可)

    6.将add的文件commit到仓库中

    git commit -m "SaveImage"

    “SaveImage” 为注释语句,提交到GitHub之后会显示到每个文件夹的后面,建议直接写成项目名称即可。

    7.去github上创建自己的Repository,创建页面如下图所示:(链接:https://github.com/new)

    1240
    050069CA-A997-44B8-B338-2A4F48CFD584.png


    项目名称直接写成你的项目工程名即可,项目简介建议写成你上传项目的主要功能,这样别人在搜索的时候,可以更加直观快速的了解你的项目是干什么的,填写完后才能之后点击Create repository按钮仓库便创建成功。

    进入这个界面

    1240
    76158C3B-D6AC-48F8-975B-AABBB8BC1D63.png

    复制红框中的地址。
    8.将本地的仓库与GitHub远程仓库连接起来

    git remote add origin https://github.com/18811314750/SZKImagePickerVC.git

    https://github.com/18811314750/SZKImagePickerVC.git 即刚才复制的红框中的地址(此地址为笔者的封装的快速调用本地相机,相册的功能,安全无毒,感兴趣的朋友可以查看)。

    9.上传github之前,要先pull一下,执行如下命令:

    git pull origin master

    10.最后一步,上传代码到github远程仓库

    git push -u origin master

    执行完后,如果没有异常,等待执行完就上传成功了,中间可能会让你输入Username和Password,你只要输入github的账号和密码就行了

    最后附上上传成功的截图:

    1240
    81BF5D29-C86D-437E-920F-76D1CD44BDBD.png
    展开全文
  • iOS开发的朋友们经常会用到终端来下载和管理第三方的类库,所以了解常用的命令行必不可少,下面简单介绍一下,怎么利用命令行实现将本地项目代码上传到GitHub上。 1.首先你要拥有GitHub的账号,注册地址:...
  • java代码实现tar包压缩文件的代码在网上能找到很多,但是要不就是压缩之后的文件会有空文件夹在压缩包中,要不就是压缩之后的文件在Linux服务器上解压出现问题,产生这个问题的主要原因是文件的目录分隔符没有设置...
  • UNITE数据库怎么

    2021-04-13 12:39:10
    UNITE数据库怎么用首先,从UNITE官网下载数据库,得到一个压缩包拿到后,要将其转化Qiime2可用的,用下面的代码就可以实现:但是,我在的时候发现,这样注释出来的有很多unassigned,所以,需要对这个库进行训练:...
  • java代码实现tar包压缩文件的代码在网上能找到很多,但是要不就是压缩之后的文件会有空文件夹在压缩包中,要不就是压缩之后的文件在Linux服务器上解压出现问题,产生这个问题的主要原因是文件的目录分隔符没有设置...
  • WIN XP蓝屏代码大全

    2013-08-08 12:29:21
    第一次发生时你对系统了哪些操作; 发生时正在进行什么操作. 从这些信息中找出可能的原因, 从而选择相应解决方案尝试排除. 3、0x0000001A:MEMORY_MANAGEMENT ◆错误分析:这个内存管理错误往往是由硬件引起的, ...
  • 这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件不到的,它还可以检测代码是否被篡改过。那么jar文件如何打开?下面,小编就来跟大家分享打开jar文件的步骤了。什么是.jar文件?jar...
  • webuploader 大文件分片上传处理如何解决?webuploader 大文件分片上传处理如何解决关于插件的使用可以参考快速使用...求webuploader web 大文件上传源代码webuploader上传大文件后台java怎么接收基本都是通过file来...
  • 什么是.jar文件?jar文件是Java项目生成的一个小的文件项目,也可以...这样,能够识别签名的工具就可以有选择地为您授予软件安全特权,这是其他文件不到的,它还可以检测代码是否被篡改过。那么jar文件如何打开...
  • 1、下载文件 imgchk.rar 该压缩包为 imgchk 文件夹 ,其中有三个文件:validatecode.asp,validatebody.fix,validatehead.fix 主要即是为生成 验证码 服务的。 将解压文件夹直接释放在需要在某页添加验证码...
  • 了一个我认为比较浅显易懂的随笔 分为三步 目录 1.压缩包下载(点击下载) 2.上传文件 3.添加代码 具体实施 1.首先下载一个压缩包 /---压缩包下载---/ 2.上传文件 3.添加代码代码粘贴...
  • HTML下使用Radio设置选择样式。

    千次阅读 2016-05-16 09:49:12
    有时候我们想在支付页面设置多个支付样式,方便用户勾选,但是如果只是简单使用radio就不是很直观,就几个字,支付宝,网银在线...那我就直接发代码了,不发压缩包了。 支付方式选择 .on{margin:5px;border:3px s
  • Weblogic 12c启动安装程序

    千次阅读 2017-09-18 14:57:09
    尤其是启动安装程序,按网上的方法怎么做都不对。当你在命令行敲处解压压缩包代码 java -jar fmw_12.2.1.2.0_wls.jar,都会出现这种错误 或者你这样做,把压缩包直接解压了。在这个目录下fmw_12.
  • 需要将拿到的 gz、z格式的压缩文件解压缩后处理。通过java代码怎么实现?或者有什么开源工具包可用?gz、z压缩包里含有多个文件。
  • HLSSplit.RAR

    2009-05-11 12:51:47
    这个是海量智能分词研究版,里面自带语料库,实例,说明...分词,统计都的很好,不过是封装成了dll和lib,不能看到核心的源代码,但是在此基础上应用还是很好的。 原来那个压缩包不知道怎么损坏了,重新上传一个
  • (提醒小伙伴么,JS里面的东西不需要过深的研究与学习,只需要给你这个JS文件会用即可,知道怎么用即可)当然了如果出去JS里面的部分就只剩余HTML,CSS部分了(这两部分代码不会过多的一一解释,需要的情况下可以...
  • 安装wordpress怎么装 setp2了就 报"Table Prefix" must not be empty.这错。 原因就是没按文档说明的来。 就老老实实的先看看文档嘛。把返回第一步中解压WordPress压缩包的位置, 将wp-config-sample.php...
  • 游戏编程--数据管理

    2008-10-08 10:56:11
    说了那么多压缩包的好处,我们在游戏中到底怎么使用压缩包呢?  1.我们需要定义我们自己的压缩包文件存储格式。  2.根据1我们写一个压缩工具来对游戏中的资源进行压缩存储。  3.根据1我们写一个解压缩的库以便...
  • 前几天做了一个上传下载功能,开始...但查了半天,还是不知道该怎么做,如果有看到这个文章并正好知道的朋友麻烦告诉或指正一下。 好了,上代码: //1、获取数据,根据数据(树形)创建目录与目录下的文件夹。 //2

空空如也

空空如也

1 2 3 4 5
收藏数 86
精华内容 34
关键字:

代码压缩包怎么做