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

4

我需要使用Coldfusion\Java在Windows服务器上创建一个包含多个文件的TAR文件。我找到了许多关于解压它们的例子,但很少有关于创建它们的例子。我发现了这个使用gzip向文件添加一些文本的例子,并且它可以工作,但是我需要添加文件。我也不确定gzip是否与构建tarball是相同的。这个项目要求我在非常短的时间内完成,所以任何朝着正确方向的帮助都将不胜感激:

Win Server 2012, ColdFusion 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() />
1个回答

3

虽然经常一起使用, tar 和 gzip 是不同的东西。根据ZIP vs. GZIP

... tar 命令用于创建档案(未压缩),而另一个程序(gzip或compress)用于压缩该档案。

一个简单的选择是安装7-Zip(支持tar和gzip),并从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\7-Zip\7z.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选项,这个线程提到使用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 - TAR包

NB:如果您要存档大文件,请考虑使用缓冲区。有关基本概念,请参见代码示例3:Zip.java。忽略它是针对Zip文件的事实。基本概念相同,只是类不同。


使用哪个示例?在我的(简短)测试中,两者都在7zip中没有错误地打开。 - Leigh
我只用了从文件创建条目的部分,并将从字符串的条目注释掉。我还重复了来自文件的条目并添加了两个tiff文件。每次我都会收到来自7-zip相同的错误,但是文件仍然可以在7-zip中打开,并且我可以轻松地提取文件。这个讨论涉及了这个问题,但似乎不太重要: - RobE
上面提到的讨论最终得出结论,他们通过从commons 1.0升级到1.9来解决了问题。我确认CF10使用的是1.0版本,但我不确定是否应该尝试替换为另一个版本。 - RobE
这个可以工作,但我还需要使用目录结构将文件放置在tar中。我如何创建或指定路径? - RobE
我确认CF10使用了1.0...啊,我用CF11测试过,可能就是这个原因。既然你正在使用CF10+,而不是覆盖内置的JAR文件,试试使用this.javaSettings来加载更新版本。它基本上就是JavaLoader.cfc的翻版,嵌入在Application.cfc中。 - Leigh
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接