Files
ddc/internal/extract/zip.go
T
2026-10-25 20:24:50 -04:00

45 lines
913 B
Go
Executable File

package extract
import "archive/zip"
func extractZip(archivePath string, writer *entryWriter) error {
reader, err := zip.OpenReader(archivePath)
if err != nil {
return err
}
defer reader.Close()
var declaredBytes uint64
for _, file := range reader.File {
declaredBytes += file.UncompressedSize64
}
if declaredBytes > uint64(writer.limits.MaxBytes) {
return ErrTooLarge
}
writer.progress.SetTotal(int64(declaredBytes))
for _, file := range reader.File {
if err := extractZipEntry(file, writer); err != nil {
return err
}
}
return nil
}
func extractZipEntry(file *zip.File, writer *entryWriter) error {
mode := file.Mode()
switch {
case mode.IsDir():
return writer.writeDirectory(file.Name)
case mode.IsRegular():
content, err := file.Open()
if err != nil {
return err
}
defer content.Close()
return writer.writeFile(file.Name, content)
default:
return nil
}
}