Source File
struct.go
Belonging Package
archive/zip
package zip
import (
)
const (
Store uint16 = 0 // no compression
Deflate uint16 = 8 // DEFLATE compressed
)
const (
fileHeaderSignature = 0x04034b50
directoryHeaderSignature = 0x02014b50
directoryEndSignature = 0x06054b50
directory64LocSignature = 0x07064b50
directory64EndSignature = 0x06064b50
dataDescriptorSignature = 0x08074b50 // de-facto standard; required by OS X Finder
fileHeaderLen = 30 // + filename + extra
directoryHeaderLen = 46 // + filename + extra + comment
directoryEndLen = 22 // + comment
dataDescriptorLen = 16 // four uint32: descriptor signature, crc32, compressed size, size
dataDescriptor64Len = 24 // descriptor with 8 byte sizes
directory64LocLen = 20 //
directory64EndLen = 56 // + extra
creatorFAT = 0
creatorUnix = 3
creatorNTFS = 11
creatorVFAT = 14
creatorMacOSX = 19
zipVersion20 = 20 // 2.0
zipVersion45 = 45 // 4.5 (reads and writes zip64 archives)
zip64ExtraID = 0x0001 // Zip64 extended information
ntfsExtraID = 0x000a // NTFS
unixExtraID = 0x000d // UNIX
extTimeExtraID = 0x5455 // Extended timestamp
infoZipUnixExtraID = 0x5855 // Info-ZIP Unix extension
)
Modified time.Time
ModifiedTime uint16 // Deprecated: Legacy MS-DOS date; use Modified instead.
ModifiedDate uint16 // Deprecated: Legacy MS-DOS time; use Modified instead.
CRC32 uint32
CompressedSize uint32 // Deprecated: Use CompressedSize64 instead.
UncompressedSize uint32 // Deprecated: Use UncompressedSize64 instead.
CompressedSize64 uint64
UncompressedSize64 uint64
Extra []byte
ExternalAttrs uint32 // Meaning depends on CreatorVersion
}
func ( *FileHeader) () fs.FileInfo {
return headerFileInfo{}
}
type headerFileInfo struct {
fh *FileHeader
}
func ( headerFileInfo) () string { return path.Base(.fh.Name) }
func ( headerFileInfo) () int64 {
if .fh.UncompressedSize64 > 0 {
return int64(.fh.UncompressedSize64)
}
return int64(.fh.UncompressedSize)
}
func ( headerFileInfo) () bool { return .Mode().IsDir() }
func ( headerFileInfo) () time.Time {
if .fh.Modified.IsZero() {
return .fh.ModTime()
}
return .fh.Modified.UTC()
}
func ( headerFileInfo) () fs.FileMode { return .fh.Mode() }
func ( headerFileInfo) () fs.FileMode { return .fh.Mode().Type() }
func ( headerFileInfo) () interface{} { return .fh }
func ( headerFileInfo) () (fs.FileInfo, error) { return , nil }
func ( fs.FileInfo) (*FileHeader, error) {
:= .Size()
:= &FileHeader{
Name: .Name(),
UncompressedSize64: uint64(),
}
.SetModTime(.ModTime())
.SetMode(.Mode())
if .UncompressedSize64 > uint32max {
.UncompressedSize = uint32max
} else {
.UncompressedSize = uint32(.UncompressedSize64)
}
return , nil
}
type directoryEnd struct {
diskNbr uint32 // unused
dirDiskNbr uint32 // unused
dirRecordsThisDisk uint64 // unused
directoryRecords uint64
directorySize uint64
directoryOffset uint64 // relative to file
commentLen uint16
comment string
}
func ( *FileHeader) () time.Time {
return msDosTimeToTime(.ModifiedDate, .ModifiedTime)
}
func ( *FileHeader) ( time.Time) {
= .UTC() // Convert to UTC for compatibility
.Modified =
.ModifiedDate, .ModifiedTime = timeToMsDosTime()
}
func ( *FileHeader) () ( fs.FileMode) {
switch .CreatorVersion >> 8 {
case creatorUnix, creatorMacOSX:
= unixModeToFileMode(.ExternalAttrs >> 16)
case creatorNTFS, creatorVFAT, creatorFAT:
= msdosModeToFileMode(.ExternalAttrs)
}
if len(.Name) > 0 && .Name[len(.Name)-1] == '/' {
|= fs.ModeDir
}
return
}
func ( *FileHeader) ( fs.FileMode) {
.CreatorVersion = .CreatorVersion&0xff | creatorUnix<<8
.ExternalAttrs = fileModeToUnixMode() << 16
if &fs.ModeDir != 0 {
.ExternalAttrs |= msdosDir
}
if &0200 == 0 {
.ExternalAttrs |= msdosReadOnly
}
}
func ( *FileHeader) () bool {
return .CompressedSize64 >= uint32max || .UncompressedSize64 >= uint32max
}
func ( uint32) ( fs.FileMode) {
if &msdosDir != 0 {
= fs.ModeDir | 0777
} else {
= 0666
}
if &msdosReadOnly != 0 {
&^= 0222
}
return
}
func ( fs.FileMode) uint32 {
var uint32
switch & fs.ModeType {
default:
= s_IFREG
case fs.ModeDir:
= s_IFDIR
case fs.ModeSymlink:
= s_IFLNK
case fs.ModeNamedPipe:
= s_IFIFO
case fs.ModeSocket:
= s_IFSOCK
case fs.ModeDevice:
if &fs.ModeCharDevice != 0 {
= s_IFCHR
} else {
= s_IFBLK
}
}
if &fs.ModeSetuid != 0 {
|= s_ISUID
}
if &fs.ModeSetgid != 0 {
|= s_ISGID
}
if &fs.ModeSticky != 0 {
|= s_ISVTX
}
return | uint32(&0777)
}
func ( uint32) fs.FileMode {
:= fs.FileMode( & 0777)
switch & s_IFMT {
case s_IFBLK:
|= fs.ModeDevice
case s_IFCHR:
|= fs.ModeDevice | fs.ModeCharDevice
case s_IFDIR:
|= fs.ModeDir
case s_IFIFO:
|= fs.ModeNamedPipe
case s_IFLNK:
|= fs.ModeSymlink
case s_IFSOCK:
|= fs.ModeSocket
}
if &s_ISGID != 0 {
|= fs.ModeSetgid
}
if &s_ISUID != 0 {
|= fs.ModeSetuid
}
if &s_ISVTX != 0 {
|= fs.ModeSticky
}
return
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |