`

支持Window和Linux下tar.gz文件压缩

 
阅读更多
最近做文件压缩,最后在Window下压缩解压后都可以,可是在Windows下压缩后到Linux下用命令解压(tar zxvf tarname.tar.gz -C unFolderName)就出现问题了,文件名包括在单独的文件中(05\foldername\file.txt)。

后来发现是压缩单独的文件时出错了,
TarArchiveEntry tae = new TarArchiveEntry(file, finalFileName);
这样写就出现了以上错误,改成以下一个参数的就可以了
TarArchiveEntry tae = new TarArchiveEntry(finalFileName);


另外就是,压缩文件夹和压缩单独文件分开



private void compressPerDayFolder(String currentDay) throws IOException,
      CompressorException {
    // prepare current need to compress day source file folder
    StringBuffer sourceFileDirPath = new StringBuffer(compressMonthDirPath)
        .append("/").append(currentDay);
    String sourceFileDirPathStr = sourceFileDirPath.toString().replace("/",
        File.separator);
    File sourceFileDir = new File(sourceFileDirPathStr);

    // prepare current Day directory for following use
    compressDayDirPath = sourceFileDirPathStr;
    compressDayDirPathLengthAddOne = sourceFileDirPathStr.length() + 1;

    // prepare current day finally compressed file
    StringBuffer targetFileName = new StringBuffer("snapshot_archive_")
        .append(compressYear).append(compressMonth).append(currentDay)
        .append(".tar.gz");
    StringBuffer targetFilePath = new StringBuffer(compressMonthDirPath)
        .append(File.separator).append(targetFileName);
    File targetFile = new File(targetFilePath.toString());

    if (sourceFileDir.isDirectory()) {
      File[] sourceFileArr = sourceFileDir.listFiles();

      // compress all files in this day folder
      packAndCompressSnapshotXmlFiles(sourceFileArr, targetFile);
    } else {
      getLogger().error("This is not folder: " + sourceFileDirPathStr);
    }
  }

private void packAndCompressSnapshotXmlFiles(File[] sourceFileArr,
      File targetFile) throws IOException,
      CompressorException {
    FileOutputStream fileOutputStream = null;
    CompressorOutputStream gzippedOut = null;
    TarArchiveOutputStream taos = null;

    try {
      fileOutputStream = FileUtils.openOutputStream(targetFile);

      gzippedOut = new CompressorStreamFactory().createCompressorOutputStream(
          CompressorStreamFactory.GZIP, fileOutputStream);

      taos = new TarArchiveOutputStream(gzippedOut);
      // iteration all files in this day folder to compress
      for (File hourDirFile : sourceFileArr) {
        compressSnapshotFolders(hourDirFile, taos);
      }
    } catch (IOException ioe) {
      throw ioe;
    } catch (CompressorException ce) {
      throw ce;
    } finally {
      if (taos != null) {
        try {
          taos.close();
        } catch (IOException e) {
        }
      }

      if (gzippedOut != null) {
        try {
          gzippedOut.close();
        } catch (IOException e) {
        }
      }
    }

  }

  private void compressSnapshotFolders(File file,
      TarArchiveOutputStream taos) throws IOException {
    if (file.isDirectory()) {
      parkAndCompressPerDir(file, taos);
      
      File[] subFileArr = file.listFiles();
      for (File subFile : subFileArr) {
        compressSnapshotFolders(subFile, taos);
      }
    } else {
      parkAndCompressPerFile(file, taos);
    }
  }

  private void parkAndCompressPerFile(File file, TarArchiveOutputStream taos)
      throws IOException {
    // substring the file name path(forget all before the day folder, not
    // including the day and file separator)
    String fileAbstPath = file.getAbsolutePath();
    String finalFileName = fileAbstPath.substring(fileAbstPath
        .indexOf(compressDayDirPath) + compressDayDirPathLengthAddOne);

    // this file will in this folders if the name string including
    // current operation system file separator
    TarArchiveEntry tae = new TarArchiveEntry(finalFileName);
    tae.setSize(file.length());
    taos.putArchiveEntry(tae);
    taos.write(FileUtils.readFileToByteArray(file));
    taos.closeArchiveEntry();
  }
  
  private void parkAndCompressPerDir(File file, TarArchiveOutputStream taos)
      throws IOException {
    // substring the file name path(forget all before the day folder, not
    // including the day and file separator)
    String fileAbstPath = file.getAbsolutePath();
    String finalFileName = fileAbstPath.substring(fileAbstPath
        .indexOf(compressDayDirPath) + compressDayDirPathLengthAddOne);

    // this file will in this folders if the name string including
    // current operation system file separator
    TarArchiveEntry tae = new TarArchiveEntry(finalFileName + File.separator);
    taos.putArchiveEntry(tae);
    taos.closeArchiveEntry();
  }
分享到:
评论

相关推荐

    x11-ssh-askpass-1.2.4.1.tar.gz

    1. **解压**:使用`tar -zxvf x11-ssh-askpass-1.2.4.1.tar.gz`命令解压缩文件。 2. **进入目录**:使用`cd x11-ssh-askpass-1.2.4.1`进入解压后的目录。 3. **配置**:运行`./configure`来检查系统环境并生成适合的...

    mariadb-5.5.68.tar.gz

    这个“mariadb-5.5.68.tar.gz”文件是MariaDB 5.5.68版本的源码压缩包,采用gzip算法进行压缩,后缀为“.tar.gz”,意味着它是一个归档文件,可以包含多个文件和目录。SHA256哈希值“23FF96DB2215D3D2EB...

    tk8.5.8-src.tar.gz

    1. **解压**:首先,你需要使用`tar`命令来解压缩文件。在终端中输入`tar -zxvf tk8.5.8-src.tar.gz`,这将创建一个名为`tk8.5.8`的目录,包含所有源代码文件。 2. **进入源代码目录**:通过`cd tk8.5.8`命令进入...

    PyPI 官网下载 | embedded_window-0.0.1.tar.gz

    ".tar.gz"是Linux和Unix系统中常见的归档格式,用于打包多个文件或目录,而这里的.tar.gz文件则包含了解压后可以安装到Python环境中的源代码。 在Python中,我们通常使用pip工具来安装从PyPI下载的库。对于...

    cups-windows-6.0-source.tar.gz_cups_cups-windows

    这种格式在Unix/Linux环境中常见,用于打包和压缩文件。 描述中的“cups 6.0 opensource print management source”进一步确认了这是CUPS 6.0的开放源代码,主要用于打印管理。CUPS通过提供一套标准化的接口和机制...

    libxext-1.3.4.tar.gz

    这种格式(.tar.gz)通常用于在 Linux 和类 Unix 系统中分发开源软件,因为它能有效地压缩文件。 **描述解析:**描述提到“libx11编译使用的libxext”,这表明 libxext 是作为 libx11 编译过程中的依赖库。libx11 ...

    grads-2.0.2.oga.2-bundle-x86_64-unknown-linux-gnu.tar.gz

    `.tar.gz`是一种常见的文件打包格式,由`tar`用于归档多个文件,然后用`gzip`进行压缩。在Linux环境下,可以使用以下命令来解压: ```bash tar -zxvf grads-2.0.2.oga.2-bundle-x86_64-unknown-linux-gnu.tar.gz ``...

    CHNTEL_Linux_UI.tar.gz

    标题“CHNTEL_Linux_UI.tar.gz”表明这是一个与Linux用户界面相关的压缩文件,采用了常见的归档格式“tar.gz”。这种格式是Linux和Unix系统中广泛使用的,它结合了tar(用于打包多个文件和目录)和gzip(用于压缩...

    winutils.tar.gz

    标题“winutils.tar.gz”指的是一个包含winutils工具的压缩文件,这个工具是专门为Windows环境设计的,主要用于支持Apache Spark的运行和调试。在Spark的工作流程中,winutils.exe扮演了重要的角色,尤其是在Hadoop...

    word2vec.tar.gz 源码 安装文件

    2. **解压文件**:使用解压工具(如tar命令在Linux系统中)解压缩文件,例如:`tar -zxvf word2vec-2014-10-29.tar.gz`。 3. **进入源码目录**:解压后,进入源代码目录,例如:`cd word2vec-2014-10-29`。 4. **...

    ace-window_0.9.0.orig.tar.gz

    最后,".orig.tar.gz"是打包和压缩的格式,说明原始源代码被收集到一个tar档案中,并使用gzip进行压缩,这通常是Linux或类Unix系统中开源软件分发的标准做法。 描述中的"统信UOSdeb包"暗示了这个软件是为统信UOS...

    inputproto-2.2.tar.gz

    1. `tar -zxvf inputproto-2.2.tar.gz`:解压缩文件。 2. `cd inputproto-2.2`:进入源码目录。 3. `./configure`:配置源码,检查系统环境并生成Makefile。 4. `make`:编译源码。 5. `sudo make install`:将编译...

    Mycat-server-1.6.7.6-release-windows-linux.rar

    在实际操作中,用户需要先解压缩文件,然后在对应的操作系统上运行相应的安装程序,如在Windows环境下运行".tar.gz"文件,而在Linux环境下则需运行相同版本的".tar.gz"文件。 标签中的"mysql"和"mycat"提示我们,...

    windows下tar打包软件_TAR压缩解压

    在Windows操作系统中,通常我们使用的压缩和解压缩工具是如WinRAR或7-Zip这样的软件,但有时我们可能需要处理Linux环境下产生的`.tar`格式文件。`.tar`文件是一种非常常见的档案格式,它主要用于组合多个文件和目录...

    xpm.tar.gz_fbida_xpm tar

    总的来说,"xpm.tar.gz_fbida_xpm tar"涉及到的技术点包括:`.tar`和`.gz`文件格式,用于数据打包和压缩;`fbida`,一套终端下的图形工具,尤其适用于无GUI环境;以及XPM图像格式,适合在文本界面展示图像。理解这些...

    xf86-video-ati-6.13.2.tar.gz

    标题中的"xf86-video-ati-6.13.2.tar.gz"是一个开源图形驱动程序的源代码压缩包,用于支持AMD/ATI显卡在X Window System下的图形渲染。这个包是X.org服务器的一个扩展,提供了对ATI显示芯片组的支持。接下来,我们将...

    scim101.tar.zip

    4. **兼容性**:不仅支持X Window System,还支持GTK+、Qt等多种图形库,能在各种桌面环境如Gnome、KDE下良好工作。 5. **插件系统**:允许用户和开发者编写自定义插件以扩展功能。 标签“输入法”表明了SCIM的核心...

    My_SQL第伍版 samp_db数据库tar.gz文件

    My_SQL第伍版 samp_db数据库tar.gz文件,方便大家学习下载在linux环境下学习使用,这个压缩文件是tar.gz格式,我也提供了一个zip格式(window环境下学习),自行选择哦,如有侵权,将及时删除!

    qt-x11-2.2.0.tar.gz

    "qt-x11-2.2.0.tar.gz" 是一个针对X11窗口系统的QT库版本2.2.0的源代码压缩包,通常以.tar.gz格式发布,这是一种在Linux和Unix类操作系统中常见的文件打包和压缩方式。 1. **QT库**:QT是由Trolltech(现为The Qt ...

    mysqlcc-0.9.4-linux-glibc23.tar.gz

    - 解压文件:首先,使用`tar -zxvf mysqlcc-0.9.4-linux-glibc23.tar.gz`命令解压缩文件。 - 查看依赖:检查系统是否已安装所有必要的依赖,比如X Window System、libmysqlclient等。 - 安装依赖:如果缺少依赖,...

Global site tag (gtag.js) - Google Analytics