filetil.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package filetil
  2. import (
  3. "os"
  4. "path/filepath"
  5. "strings"
  6. "io"
  7. "fmt"
  8. )
  9. //==================================
  10. //更多文件和目录的操作,使用filepath包和os包
  11. //==================================
  12. //返回的目录扫描结果
  13. type FileList struct {
  14. IsDir bool //是否是目录
  15. Path string //文件路径
  16. Ext string //文件扩展名
  17. Name string //文件名
  18. Size int64 //文件大小
  19. ModTime int64 //文件修改时间戳
  20. }
  21. //目录扫描
  22. //@param dir 需要扫描的目录
  23. //@return fl 文件列表
  24. //@return err 错误
  25. func ScanFiles(dir string) (fl []FileList, err error) {
  26. err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  27. if err == nil {
  28. path = strings.Replace(path, "\\", "/", -1) //文件路径处理
  29. fl = append(fl, FileList{
  30. IsDir: info.IsDir(),
  31. Path: path,
  32. Ext: strings.ToLower(filepath.Ext(path)),
  33. Name: info.Name(),
  34. Size: info.Size(),
  35. ModTime: info.ModTime().Unix(),
  36. })
  37. }
  38. return err
  39. })
  40. return
  41. }
  42. //拷贝文件
  43. func CopyFile(source string, dst string) (err error) {
  44. sourceFile, err := os.Open(source)
  45. if err != nil {
  46. return err
  47. }
  48. defer sourceFile.Close()
  49. _,err = os.Stat(filepath.Dir(dst))
  50. if err != nil {
  51. if os.IsNotExist(err) {
  52. os.MkdirAll(filepath.Dir(dst),0766)
  53. }else{
  54. return err
  55. }
  56. }
  57. destFile, err := os.Create(dst)
  58. if err != nil {
  59. return err
  60. }
  61. defer destFile.Close()
  62. _, err = io.Copy(destFile, sourceFile)
  63. if err == nil {
  64. sourceInfo, err := os.Stat(source)
  65. if err != nil {
  66. err = os.Chmod(dst, sourceInfo.Mode())
  67. }
  68. }
  69. return
  70. }
  71. //拷贝目录
  72. func CopyDir(source string, dest string) (err error) {
  73. // get properties of source dir
  74. sourceInfo, err := os.Stat(source)
  75. if err != nil {
  76. return err
  77. }
  78. // create dest dir
  79. err = os.MkdirAll(dest, sourceInfo.Mode())
  80. if err != nil {
  81. return err
  82. }
  83. directory, _ := os.Open(source)
  84. objects, err := directory.Readdir(-1)
  85. for _, obj := range objects {
  86. sourceFilePointer := filepath.Join(source , obj.Name())
  87. destinationFilePointer := filepath.Join(dest, obj.Name())
  88. if obj.IsDir() {
  89. // create sub-directories - recursively
  90. err = CopyDir(sourceFilePointer, destinationFilePointer)
  91. if err != nil {
  92. fmt.Println(err)
  93. }
  94. } else {
  95. // perform copy
  96. err = CopyFile(sourceFilePointer, destinationFilePointer)
  97. if err != nil {
  98. fmt.Println(err)
  99. }
  100. }
  101. }
  102. return
  103. }
  104. func RemoveDir(dir string) error {
  105. return os.RemoveAll(dir)
  106. }