file.go 1020 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package tar2go
  2. import (
  3. "archive/tar"
  4. "io"
  5. "io/fs"
  6. "time"
  7. )
  8. type file struct {
  9. idx *indexReader
  10. rdr *io.SectionReader
  11. }
  12. func newFile(idx *indexReader) *file {
  13. return &file{idx: idx, rdr: io.NewSectionReader(idx.rdr, idx.offset, idx.size)}
  14. }
  15. type fileinfo struct {
  16. h *tar.Header
  17. }
  18. func (f *fileinfo) Name() string {
  19. return f.h.Name
  20. }
  21. func (f *fileinfo) Size() int64 {
  22. return f.h.Size
  23. }
  24. func (f *fileinfo) Mode() fs.FileMode {
  25. return fs.FileMode(f.h.Mode)
  26. }
  27. func (f *fileinfo) ModTime() time.Time {
  28. return f.h.ModTime
  29. }
  30. func (f *fileinfo) IsDir() bool {
  31. return f.h.Typeflag == tar.TypeDir
  32. }
  33. func (f *file) Close() error {
  34. return nil
  35. }
  36. func (f *fileinfo) Sys() interface{} {
  37. h := *f.h
  38. return &h
  39. }
  40. func (f *file) Read(p []byte) (int, error) {
  41. return f.rdr.Read(p)
  42. }
  43. func (f *file) ReadAt(p []byte, off int64) (int, error) {
  44. return f.rdr.ReadAt(p, off)
  45. }
  46. func (f *file) Size() int64 {
  47. return f.rdr.Size()
  48. }
  49. func (f *file) Stat() (fs.FileInfo, error) {
  50. return &fileinfo{h: f.idx.hdr}, nil
  51. }