utils.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package driver
  2. import (
  3. "io"
  4. "io/ioutil"
  5. "os"
  6. "sort"
  7. )
  8. // ReadFile works the same as ioutil.ReadFile with the Driver abstraction
  9. func ReadFile(r Driver, filename string) ([]byte, error) {
  10. f, err := r.Open(filename)
  11. if err != nil {
  12. return nil, err
  13. }
  14. defer f.Close()
  15. data, err := ioutil.ReadAll(f)
  16. if err != nil {
  17. return nil, err
  18. }
  19. return data, nil
  20. }
  21. // WriteFile works the same as ioutil.WriteFile with the Driver abstraction
  22. func WriteFile(r Driver, filename string, data []byte, perm os.FileMode) error {
  23. f, err := r.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
  24. if err != nil {
  25. return err
  26. }
  27. defer f.Close()
  28. n, err := f.Write(data)
  29. if err != nil {
  30. return err
  31. } else if n != len(data) {
  32. return io.ErrShortWrite
  33. }
  34. return nil
  35. }
  36. // ReadDir works the same as ioutil.ReadDir with the Driver abstraction
  37. func ReadDir(r Driver, dirname string) ([]os.FileInfo, error) {
  38. f, err := r.Open(dirname)
  39. if err != nil {
  40. return nil, err
  41. }
  42. defer f.Close()
  43. dirs, err := f.Readdir(-1)
  44. if err != nil {
  45. return nil, err
  46. }
  47. sort.Sort(fileInfos(dirs))
  48. return dirs, nil
  49. }
  50. // Simple implementation of the sort.Interface for os.FileInfo
  51. type fileInfos []os.FileInfo
  52. func (fis fileInfos) Len() int {
  53. return len(fis)
  54. }
  55. func (fis fileInfos) Less(i, j int) bool {
  56. return fis[i].Name() < fis[j].Name()
  57. }
  58. func (fis fileInfos) Swap(i, j int) {
  59. fis[i], fis[j] = fis[j], fis[i]
  60. }