45 lines
913 B
Go
Executable File
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
|
|
}
|
|
}
|