file.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package http
  2. import (
  3. "io/fs"
  4. "net/http"
  5. "time"
  6. )
  7. type (
  8. FS struct {
  9. fs http.FileSystem
  10. modtime time.Time
  11. }
  12. File struct {
  13. fp http.File
  14. modtime time.Time
  15. }
  16. FileInfo struct {
  17. name string
  18. size int64
  19. mode fs.FileMode
  20. isDir bool
  21. modtime time.Time
  22. }
  23. )
  24. func (fi *FileInfo) Name() string {
  25. return fi.name
  26. }
  27. func (fi *FileInfo) Size() int64 {
  28. return fi.size
  29. }
  30. func (fi *FileInfo) Mode() fs.FileMode {
  31. return fi.mode
  32. }
  33. func (fi *FileInfo) ModTime() time.Time {
  34. return fi.modtime
  35. }
  36. func (fi *FileInfo) IsDir() bool {
  37. return fi.isDir
  38. }
  39. func (fi *FileInfo) Sys() any {
  40. return nil
  41. }
  42. func (file *File) Close() error {
  43. return file.fp.Close()
  44. }
  45. func (file *File) Read(p []byte) (n int, err error) {
  46. return file.fp.Read(p)
  47. }
  48. func (file *File) Seek(offset int64, whence int) (int64, error) {
  49. return file.fp.Seek(offset, whence)
  50. }
  51. func (file *File) Readdir(count int) ([]fs.FileInfo, error) {
  52. return file.fp.Readdir(count)
  53. }
  54. func (file *File) Stat() (fs.FileInfo, error) {
  55. fi, err := file.fp.Stat()
  56. if err != nil {
  57. return nil, err
  58. }
  59. return newFileInfo(fi, file.modtime), nil
  60. }
  61. func (fs *FS) Open(name string) (http.File, error) {
  62. fp, err := fs.fs.Open(name)
  63. if err != nil {
  64. return nil, err
  65. }
  66. return &File{fp: fp, modtime: fs.modtime}, nil
  67. }
  68. func newFS(modtime time.Time, fs http.FileSystem) *FS {
  69. return &FS{
  70. fs: fs,
  71. modtime: modtime,
  72. }
  73. }
  74. func newFileInfo(fi fs.FileInfo, modtime time.Time) *FileInfo {
  75. return &FileInfo{
  76. name: fi.Name(),
  77. size: fi.Size(),
  78. mode: fi.Mode(),
  79. isDir: fi.IsDir(),
  80. modtime: modtime,
  81. }
  82. }