http_dir.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package vessel
  2. import (
  3. "io"
  4. "net/http"
  5. "os"
  6. "time"
  7. )
  8. // File implements an http.File
  9. type Dir struct {
  10. name string
  11. mode os.FileMode
  12. fs *FileSystem
  13. }
  14. // verify we implement the http.File interface
  15. var _ http.File = (*Dir)(nil)
  16. var _ os.FileInfo = (*Dir)(nil)
  17. // Readdir implements http.File
  18. func (f *Dir) Readdir(count int) ([]os.FileInfo, error) {
  19. files, err := f.fs.Dir(f.name)
  20. if err != nil {
  21. return nil, err
  22. }
  23. if len(files) < count {
  24. count = len(files)
  25. }
  26. return files[:count], nil
  27. }
  28. // Stat implements http.File
  29. func (f *Dir) Stat() (os.FileInfo, error) {
  30. return f, nil
  31. }
  32. // Seek implements io.Seeker
  33. func (f *Dir) Seek(offset int64, whence int) (int64, error) {
  34. return 0, os.ErrInvalid
  35. }
  36. // Read implements io.Reader
  37. func (f *Dir) Read(p []byte) (n int, err error) {
  38. return 0, io.EOF
  39. }
  40. // Close implements io.Closer
  41. func (f *Dir) Close() error {
  42. return nil
  43. }
  44. // implement file info interface as well
  45. func (f *Dir) Name() string {
  46. return f.name
  47. }
  48. func (f *Dir) Size() int64 {
  49. return 0
  50. }
  51. func (f *Dir) Mode() os.FileMode {
  52. return f.mode
  53. }
  54. func (f *Dir) ModTime() time.Time {
  55. return time.Now()
  56. }
  57. func (f *Dir) IsDir() bool {
  58. return true
  59. }
  60. func (f *Dir) Sys() interface{} {
  61. return nil
  62. }