在 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 文件的事实。基本概念是一样的,只有 类 不同。
我需要使用 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 文件的事实。基本概念是一样的,只有 类 不同。