我有一个邮编文件包含一个文件夹结构喜欢

  • 主要文件夹/
    • subFolder1/
    • subFolder2/
    • subFolder3/
      • file3.1
      • file3.2

我想重新命名的文件夹 main-folder 对我们来说 versionXY 那里面非常zip文件使用Java。

是否有一个更简单的方式提取整个拉链文件,并重新创建一个新的使用的新文件夹的名字?

有帮助吗?

解决方案

拉链是一个存档格式,以改变通常涉及改写的文件。

一些特定特征的拉链也得到的方式(拉链是完整的"功能").以及中央目录结束时的档案,每个组成部分的文件之前是通过其文件的名称。拉链没有一个概念目录的文件的名称只是串发生的包括"/"符(与子如"../".

所以,你真的需要复制该文件的使用 ZipInputStreamZipOutputStream, 重命名为你去。如果你真的想你能重写文件的地方做你自己的缓冲。过程不会导致的内容压缩的标准API没有手段获得的数据压缩形式。

其他提示

我知道你问Java但只是为了存档目的,我认为我也作出贡献的一个注。网。

DotNetZip 是的一个。净库拉链文件,允许重新命名的项目。汤姆Hawtin的答复国,目录不一类实体的邮政编文件元数据,并作为一个结果是,没有拉链的图书馆,我知道让一个"重新命名目录"动词。但是,一些图书馆能让你重新命名的所有条目的的名称,表明一个特定的目录,它给你你想要的结果。

在DotNetZip,它看起来是这样的:

 var regex = new Regex("/OldDirName/.*$");
 int renameCount= 0;
 using (ZipFile zip = ZipFile.Read(ExistingZipFile))
 {
    foreach (ZipEntry e in zip)
    {
        if (regex.IsMatch(e.FileName))
        {
            // rename here
            e.FileName = e.FileName.Replace("/OldDirName/", "/NewDirName/");
            renameCount++;
        }
    }
    if (renameCount > 0)
    {
        zip.Comment = String.Format("This archive has been modified. {0} entries have been renamed.", renameCount);
        // any changes to the entries are made permanent by Save()
        zip.Save();  // could also save to a new zip file here
    }
 }

你还可以添加或删除的项目,内部使用条款。

如果你救了同一文件,然后DotNetZip重写只有改变的元数据进入标题和中心目录,记录重新命名条目,从而节省时间与大档案。如果保存到一个新的文件或流,然后所有的邮政编的数据编写的。

我认为你将能够找到帮助这一任务使用 共用压缩, 尤其是 ZipArchiveEntry

这是这样做的诀窍。速度极快,因为它仅适用于中央目录和没有文件。

//  rezip( zipfile, "/main-folder", "/versionXY" );

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;


protected void rezip( String zipfile, String olddir, String newdir ) {

    Path zipFilePath = Paths.get( zipfile );
    try (FileSystem fs = FileSystems.newFileSystem( zipFilePath, null )) {
        Path oldpathInsideZipPath = fs.getPath( olddir );
        if( ! Files.exists( Paths.get( newdir ) ) )
            Files.createDirectory( Paths.get( newdir ) );

        if ( Files.exists( oldpathInsideZipPath, LinkOption.NOFOLLOW_LINKS ) ) {
            Files.walkFileTree(oldpathInsideZipPath, new SimpleFileVisitor<Path>() {
                 @Override
                 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                     throws IOException
                 {
                     if( file.toString().indexOf( olddir ) > -1 ){
                         String a = file.toString().replaceAll( olddir, newdir );
                         Path b = fs.getPath( a );
                         if( ! Files.exists( b.getParent() ) ){
                             Files.createDirectories( b.getParent() );
                         }
                         Files.move( file, b, LinkOption.NOFOLLOW_LINKS );
                     }
                     return FileVisitResult.CONTINUE;
                 }
                 @Override
                 public FileVisitResult postVisitDirectory(Path dir, IOException e)
                     throws IOException
                 {
                     if (e == null) {
                         Files.delete(dir);
                         return FileVisitResult.CONTINUE;
                     } else {
                         // directory iteration failed
                         throw e;
                     }
                 }
             });
        }
        fs.close();
    } catch ( Exception e ) {
        e.printStackTrace();
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top