gpt4 book ai didi

java - 如何使用 ZipEntry 在 Zip 中添加重复文件

转载 作者:行者123 更新时间:2023-12-02 17:06:43 27 4
gpt4 key购买 nike

我有一个文件列表,该列表可能包含重复的文件名,但这些文件位于具有不同数据的不同位置。现在,当我尝试将这些文件添加到 zip 中时,我得到了 java.lang.Exception: duplicate entry: File1.xlsx。请建议我如何添加重复的文件名。一种解决方案就像我可以将重复文件重命名为 File 、 File_1、File_2 .. 但我不确定如何实现它。请帮忙 !!!如果所有文件名都是唯一的,下面是我的工作代码。

Resource resource = null;
try (ZipOutputStream zippedOut = new ZipOutputStream(response.getOutputStream())) {

for (String file : fileNames) {

resource = new FileSystemResource(file);

if(!resource.exists() && resource != null) {

ZipEntry e = new ZipEntry(resource.getFilename());
//Configure the zip entry, the properties of the file
e.setSize(resource.contentLength());
e.setTime(System.currentTimeMillis());
// etc.
zippedOut.putNextEntry(e);
//And the content of the resource:
StreamUtils.copy(resource.getInputStream(), zippedOut);
zippedOut.closeEntry();

}
}
//zippedOut.close();
zippedOut.finish();

return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=download.zip").body(zippedOut);
} catch (Exception e) {
throw new Exception(e.getMessage());
}

最佳答案

One solution is like if I can rename the duplicate file as File, File_1, File_2, ... But I am not sure how I can achieve it.

构建一个 Set 名称,并在需要时附加一个数字以使名称唯一,例如

Set<String> names = new HashSet<>();
for (String file : fileNames) {

// ...

String name = resource.getFilename();
String originalName = name;
for (int i = 1; ! names.add(name); i++)
name = originalName + "_" + i;
ZipEntry e = new ZipEntry(name);

// ...

}

如果名称已经在 Set 中,即如果名称重复,代码依赖于 add() 返回 false

即使给定的名称已经编号,这仍然有效,例如这是给定传入名称顺序的映射名称示例:

foo_2
foo
foo -> foo_1
foo -> foo_3 foo_2 was skipped
foo -> foo_4
foo_1 -> foo_1_1 number appended to make unique

关于java - 如何使用 ZipEntry 在 Zip 中添加重复文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51429107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com