题
我有一个邮编文件包含一个文件夹结构喜欢
- 主要文件夹/
- subFolder1/
- subFolder2/
- subFolder3/
- file3.1
- file3.2
我想重新命名的文件夹 main-folder
对我们来说 versionXY
那里面非常zip文件使用Java。
是否有一个更简单的方式提取整个拉链文件,并重新创建一个新的使用的新文件夹的名字?
解决方案
拉链是一个存档格式,以改变通常涉及改写的文件。
一些特定特征的拉链也得到的方式(拉链是完整的"功能").以及中央目录结束时的档案,每个组成部分的文件之前是通过其文件的名称。拉链没有一个概念目录的文件的名称只是串发生的包括"/"符(与子如"../".
所以,你真的需要复制该文件的使用 ZipInputStream
和 ZipOutputStream
, 重命名为你去。如果你真的想你能重写文件的地方做你自己的缓冲。过程不会导致的内容压缩的标准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();
}
}