Skip to content

Commit 8609652

Browse files
#365 Improve file header equals check to include offset of local file header
1 parent 9eab02b commit 8609652

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/main/java/net/lingala/zip4j/model/FileHeader.java

+24
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import net.lingala.zip4j.headers.HeaderSignature;
2020

21+
import java.util.Objects;
22+
2123
public class FileHeader extends AbstractFileHeader {
2224

2325
private int versionMadeBy;
@@ -92,4 +94,26 @@ public void setFileComment(String fileComment) {
9294
public String toString() {
9395
return getFileName();
9496
}
97+
98+
@Override
99+
public boolean equals(Object o) {
100+
if (this == o) return true;
101+
if (o == null || getClass() != o.getClass()) return false;
102+
if (!super.equals(o)) return false;
103+
FileHeader that = (FileHeader) o;
104+
return determineOffsetOfLocalFileHeader(this) == determineOffsetOfLocalFileHeader(that);
105+
}
106+
107+
@Override
108+
public int hashCode() {
109+
return Objects.hash(getFileName(), determineOffsetOfLocalFileHeader(this));
110+
}
111+
112+
private long determineOffsetOfLocalFileHeader(FileHeader fileHeader) {
113+
if (fileHeader.getZip64ExtendedInfo() != null) {
114+
return fileHeader.getZip64ExtendedInfo().getOffsetLocalHeader();
115+
}
116+
117+
return fileHeader.getOffsetLocalHeader();
118+
}
95119
}

src/test/java/net/lingala/zip4j/RemoveFilesFromZipIT.java

+12
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,18 @@ public void testRemoveEntryWithAnotherSimilarNameFromZipRemovesOnlyTheEntryToBeR
234234
assertZipFileDoesNotContainsFileByName(new ZipFile(zipFileUnderTest), fileNameToRemove);
235235
}
236236

237+
@Test
238+
public void testRemoveEntryFromAZipFileWithDuplicateEntriesRemovesSuccessfully() throws IOException {
239+
TestUtils.copyFile(TestUtils.getTestArchiveFromResources("zip_with_duplicate_entries.zip"), generatedZipFile);
240+
ZipFile zipFile = new ZipFile(generatedZipFile);
241+
int actualNumberOfEntries = zipFile.getFileHeaders().size();
242+
zipFile.removeFile("sample.pdf");
243+
244+
zipFile = new ZipFile(generatedZipFile);
245+
assertThat(zipFile.getFileHeaders().size()).isEqualTo(actualNumberOfEntries - 1);
246+
assertZipFileDoesNotContainsFileByName(zipFile, "sample.pdf");
247+
}
248+
237249
private void testRemoveEntryFromZipWhichHasCentralDirEntriesInDifferentOrderThanLocalEntries(
238250
String fileNameToRemove) throws IOException {
239251
TestUtils.copyFile(TestUtils.getTestArchiveFromResources("cen_dir_entries_diff_order_as_local_entries.zip"),
Binary file not shown.

0 commit comments

Comments
 (0)