我希望创建一个.tar。以下文件夹/目录结构的gz文件,同时保留相同的文件夹/目录
ParentDir\
ChildDir1\
-file1
ChildDir2\
-file2
-file3
ChildDir3\
-file4
-file5
然而,我只能创建所有文件的. tar.gz,没有文件夹/目录结构。即:ParentDir.tar.gz
ParentDir\
-file1
-file2
-file3
-file4
-file5
使用Compress目录中用户接受的答案tar.gzCommons Compress,我有以下代码:
public void exportStaticFilesTar(String appID) throws, Exception {
FileOutputStream fOut = null;
BufferedOutputStream bOut = null;
GzipCompressorOutputStream gzOut = null;
TarArchiveOutputStream tOut = null;
try {
String filename = "ParentDir.tar.gz"
//"parent/childDirToCompress/"
String path = "<path to ParentDir>";
fOut = new FileOutputStream(new File(filename));
bOut = new BufferedOutputStream(fOut);
gzOut = new GzipCompressorOutputStream(bOut);
tOut = new TarArchiveOutputStream(gzOut);
addFileToTarGz(tOut, path, "");
} catch (Exception e) {
log.error("Error creating .tar.gz: " +e);
} finally {
tOut.finish();
tOut.close();
gzOut.close();
bOut.close();
fOut.close();
}
//Download the file locally
}
private void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException {
File f = new File(path);
String entryName = base + f.getName();
TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
tOut.putArchiveEntry(tarEntry);
if (f.isFile()) {
IOUtils.copy(new FileInputStream(f), tOut);
tOut.closeArchiveEntry();
} else {
tOut.closeArchiveEntry();
File[] children = f.listFiles();
if (children != null) {
for (File child : children) {
addFileToTarGz(tOut, child.getAbsolutePath(), entryName + "/");
}
}
}
}
有人可以建议,我如何修改当前代码以保留文件夹/目录结构,以创建.tar.gz文件。谢谢!
使用请求中提到的代码,我能够在我的linux系统上生成一个成功的压缩文件。
您可以通过更改用户路径和需要压缩的根文件夹来进行复制。
public static void createTarGZ() throws FileNotFoundException, IOException
{
String sourceDirectoryPath = null;
String destinationTarGzPath = null;
FileOutputStream fileOutputStream = null;
BufferedOutputStream bufferedOutputStream = null;
GzipCompressorOutputStream gzOutpuStream = null;
TarArchiveOutputStream tarArchiveOutputStream = null;
String basePath = "/home/saad/CompressionTest/";
try
{
sourceDirectoryPath = basePath + "asterisk";
destinationTarGzPath = basePath + "asterisk.tar.gz";
fileOutputStream = new FileOutputStream(new File(destinationTarGzPath));
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
gzOutpuStream = new GzipCompressorOutputStream(bufferedOutputStream);
tarArchiveOutputStream = new TarArchiveOutputStream(gzOutpuStream);
addFileToTarGz(tarArchiveOutputStream, sourceDirectoryPath, "");
}
finally
{
tarArchiveOutputStream.finish();
tarArchiveOutputStream.close();
gzOutpuStream.close();
bufferedOutputStream.close();
fileOutputStream.close();
}
}
private static void addFileToTarGz(TarArchiveOutputStream tarOutputStream, String path, String base) throws IOException
{
File fileToCompress = new File(path);
String entryName = base + fileToCompress.getName();
TarArchiveEntry tarEntry = new TarArchiveEntry(fileToCompress, entryName);
tarOutputStream.putArchiveEntry(tarEntry);
// If its a file, simply add it
if (fileToCompress.isFile())
{
IOUtils.copy(new FileInputStream(fileToCompress), tarOutputStream);
tarOutputStream.closeArchiveEntry();
}
// If its a folder then add all its contents
else
{
tarOutputStream.closeArchiveEntry();
File[] children = fileToCompress.listFiles();
if (children != null)
{
// add every file/folder recursively to the tar
for (File child : children)
{
addFileToTarGz(tarOutputStream, child.getAbsolutePath(), entryName + "/");
}
}
}
}
我通过以下方式相处得更好。重要提示:您需要将正确的初始值作为基础
传递,该值是树中的第一个目录(不包括fs根):
private void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException {
File f = new File(path);
String entryName = base + File.separatorChar + f.getName();
TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
tOut.putArchiveEntry(tarEntry);
if (f.isFile()) {
IOUtils.copy(new FileInputStream(f), tOut);
tOut.closeArchiveEntry();
} else {
tOut.closeArchiveEntry();
File[] children = f.listFiles();
if (children != null) {
for (File child : children) {
addFileToTarGz(tOut, child.getAbsolutePath(), entryName);
}
}
}
}
问题内容: 是否存在在Java应用程序中创建临时目录的标准可靠方法?Java的问题数据库中有一个条目,注释中包含一些代码,但是我想知道在一个常用的库(Apache Commons等)中是否可以找到一种标准的解决方案? 问题答案: 如果你使用的是JDK 7,请使用新的Files.createTempDirectory类创建临时目录。 在JDK 7之前,应该这样做: 如果需要,可以提出更好的异常(IO
本文向大家介绍Java如何在不存在文件夹的目录下创建文件,包括了Java如何在不存在文件夹的目录下创建文件的使用技巧和注意事项,需要的朋友参考一下 核心代码如下所示: 1、 2、 总结 以上所述是小编给大家介绍的Java如何在不存在文件夹的目录下创建文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
前言 这一篇,我们将接着上篇来完成创建项目文件、目录结构。 回顾 先回顾一下现在项目有哪些东西了: . ├── app │ ├── app.vue │ ├── common │ │ ├── img │ │ ├── js │ │ └── scss │ ├── index.html │ ├── index.js │ ├── router
问题内容: 如果我选择一个zip文件,然后右键单击“在此处提取”,则会创建一个包含zip文件名的文件夹,并将zip文件的全部内容提取到其中。 但是,我想通过外壳转换几个zip文件。但是当我这样做 该文件夹未创建,但所有文件都提取到当前目录中。 我看过参数,但是没有这样的参数。我也试过 但是2. $ zipfile和4. $ zipfile 的扩展名必须使用sed删除。如果我做 它不起作用。 如何正
我在同一个文件夹中有数千个csv文件名,如下file_x_x.csv,其中x是1到10000之间的数字。每个文件包括一个标题和一行数据: file_1_1.csv 我的方法: 我不知道如何在最后创建一个唯一的文件。你能看一下上面的代码并告诉我如何获得所需的输出吗?如果我错过了什么?
我试图复制文件从一个文件夹到另一个文件夹使用古普: 以上代码是复制 如果我用它会将所有css文件复制到文件夹,这不是我想要的。 如何选择多个文件并保持文件夹结构?