Skip to content

Commit

Permalink
#365 Improve file header equals check to include offset of local file…
Browse files Browse the repository at this point in the history
… header
  • Loading branch information
srikanth-lingala committed Nov 10, 2021
1 parent 9eab02b commit 8609652
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/main/java/net/lingala/zip4j/model/FileHeader.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import net.lingala.zip4j.headers.HeaderSignature;

import java.util.Objects;

public class FileHeader extends AbstractFileHeader {

private int versionMadeBy;
Expand Down Expand Up @@ -92,4 +94,26 @@ public void setFileComment(String fileComment) {
public String toString() {
return getFileName();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
FileHeader that = (FileHeader) o;
return determineOffsetOfLocalFileHeader(this) == determineOffsetOfLocalFileHeader(that);
}

@Override
public int hashCode() {
return Objects.hash(getFileName(), determineOffsetOfLocalFileHeader(this));
}

private long determineOffsetOfLocalFileHeader(FileHeader fileHeader) {
if (fileHeader.getZip64ExtendedInfo() != null) {
return fileHeader.getZip64ExtendedInfo().getOffsetLocalHeader();
}

return fileHeader.getOffsetLocalHeader();
}
}
12 changes: 12 additions & 0 deletions src/test/java/net/lingala/zip4j/RemoveFilesFromZipIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,18 @@ public void testRemoveEntryWithAnotherSimilarNameFromZipRemovesOnlyTheEntryToBeR
assertZipFileDoesNotContainsFileByName(new ZipFile(zipFileUnderTest), fileNameToRemove);
}

@Test
public void testRemoveEntryFromAZipFileWithDuplicateEntriesRemovesSuccessfully() throws IOException {
TestUtils.copyFile(TestUtils.getTestArchiveFromResources("zip_with_duplicate_entries.zip"), generatedZipFile);
ZipFile zipFile = new ZipFile(generatedZipFile);
int actualNumberOfEntries = zipFile.getFileHeaders().size();
zipFile.removeFile("sample.pdf");

zipFile = new ZipFile(generatedZipFile);
assertThat(zipFile.getFileHeaders().size()).isEqualTo(actualNumberOfEntries - 1);
assertZipFileDoesNotContainsFileByName(zipFile, "sample.pdf");
}

private void testRemoveEntryFromZipWhichHasCentralDirEntriesInDifferentOrderThanLocalEntries(
String fileNameToRemove) throws IOException {
TestUtils.copyFile(TestUtils.getTestArchiveFromResources("cen_dir_entries_diff_order_as_local_entries.zip"),
Expand Down
Binary file not shown.

0 comments on commit 8609652

Please sign in to comment.