在 windows 服务器上使用 Coldfusion\Java 创建一个 TAR 文件(tarball)

Create a TAR File (tarball) using Coldfusion\Java on a windows server

我需要使用 Coldfusion\Java 在 windows 服务器上创建一个包含多个文件的 TAR 文件。我发现了很多解包它们的例子,但很少有创建它们的例子。我发现了这个使用 gzip 将一些文本添加到文件的示例并且可以正常工作,但我需要添加文件。我也不是 100% 确定 gzip 与构建压缩包是一回事。这个项目是在很短的时间内分配给我的,我正在转动我的轮子,所以非常感谢任何在正确方向上的帮助:

Win 服务器 2012, 冷聚变 10, Java 版本 1.7.0_15

    <cfset lineBreak = chr(13) & chr(10) />
<!--- open the sitemap file --->
<cfset tarFilePath = "#application.imageingFolder#DTSimages\Pending\tiff.gz" />
#tarFilePath#
<!--- create streams --->
<cfset outputStream = CreateObject("java", "java.io.FileOutputStream").Init(
            CreateObject("java","java.io.File").Init(tarFilePath)) />
<cfset gzipStream = CreateObject("java", "java.util.zip.GZIPOutputStream").Init(outputStream) />
<cfsavecontent variable="siteMapHeader"><?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
    xmlns:image="http://www.sitemaps.org/schemas/sitemap-image/1.1"
    xmlns:video="http://www.sitemaps.org/schemas/sitemap-video/1.1">
</cfsavecontent>
<cfset siteMapFooter = "</urlset>" />
<cfset gzipStream.write(ToString(siteMapHeader).GetBytes()) />

<cfset gzipStream.close() />
<cfset outputStream.close() />

虽然often used together, tar and gzip are different things. From ZIP vs. GZIP

... The tar command is used to create an archive (not compressed) and another program (gzip or compress) is used to compress the archive.

一个简单的选择是使用适当的参数安装 7-Zip (which supports tar and gzip) and invoke it from cfexecute。要创建 TAR 文件(未压缩):

<!--- 
   "a" - add files to archive 
   "t" - Type of archive 
   output .tar file 
   space separated list of files to add 
--->
<cfexecute name="c:\Program Files-Zipz.exe"
    arguments=" a -ttar c:\path\myarchive.tar c:\path\file1.xlsx c:\temp\otherfile.txt"
    variable="output"
    errorVariable="error"
    timeout="60"    />

<cfoutput>
    output = #output#<br>
    error = #error#<br>
</cfoutput> 

对于 java 选项,this thread 提到使用 Apache Commons 库创建 TAR 文件。它也恰好与 CF 捆绑在一起,因此它应该开箱即用:

http://www.oracle.com/technetwork/articles/java/compress-1565076.html

<cfscript>
    // Initialize TAR file to generate
    outputPath = "c:/temp/outputFile3.tar";
    os = createObject("java", "java.io.FileOutputStream").init(outputPath);
    tar = createObject("java", "org.apache.commons.compress.archivers.tar.TarArchiveOutputStream").init(os);

    // Add an entry from a string
    someTextContent = '<?xml version="1.0" encoding="UTF-8"?>....';
    binaryContent = charsetDecode(someTextContent, "utf-8");
    entry = createObject("java", "org.apache.commons.compress.archivers.tar.TarArchiveEntry").init("siteHeader.xml");
    entry.setSize(arrayLen(binaryContent));
    tar.putArchiveEntry(entry);
    tar.write(binaryContent);
    tar.closeArchiveEntry();

    // Create an entry from a file
    inputFile = createObject("java", "java.io.File").init("c:/path/someImage.jpg");
    entry = tar.createArchiveEntry(inputFile, "myImage.jpg");
    tar.putArchiveEntry(entry);
    tar.write(FileReadBinary(inputFile));
    tar.closeArchiveEntry();

    // Close TAR file
    tar.flush();
    tar.close();
</cfscript>

有关详细信息,请参阅文档:Apache Commons - The TAR package

注意: 如果您要归档大文件,请查看缓冲。基本概念见Code Sample 3: Zip.java。忽略它用于 Zip 文件的事实。基本概念是一样的,只有 类 不同。