file.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package file
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "mime/multipart"
  7. "os"
  8. "path"
  9. )
  10. // GetSize get the file size
  11. func GetSize(f multipart.File) (int, error) {
  12. content, err := ioutil.ReadAll(f)
  13. return len(content), err
  14. }
  15. // GetExt get the file ext
  16. func GetExt(fileName string) string {
  17. return path.Ext(fileName)
  18. }
  19. // CheckNotExist check if the file exists
  20. func CheckNotExist(src string) bool {
  21. _, err := os.Stat(src)
  22. return os.IsNotExist(err)
  23. }
  24. // CheckPermission check if the file has permission
  25. func CheckPermission(src string) bool {
  26. _, err := os.Stat(src)
  27. return os.IsPermission(err)
  28. }
  29. // IsNotExistMkDir create a directory if it does not exist
  30. func IsNotExistMkDir(src string) error {
  31. if notExist := CheckNotExist(src); notExist == true {
  32. if err := MkDir(src); err != nil {
  33. return err
  34. }
  35. }
  36. return nil
  37. }
  38. // MkDir create a directory
  39. func MkDir(src string) error {
  40. err := os.MkdirAll(src, os.ModePerm)
  41. if err != nil {
  42. return err
  43. }
  44. os.Chmod(src, 0777)
  45. return nil
  46. }
  47. // RMDir remove a directory
  48. func RMDir(src string) error {
  49. err := os.RemoveAll(src)
  50. if err != nil {
  51. return err
  52. }
  53. os.Remove(src)
  54. return nil
  55. }
  56. // Open a file according to a specific mode
  57. func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
  58. f, err := os.OpenFile(name, flag, perm)
  59. if err != nil {
  60. return nil, err
  61. }
  62. return f, nil
  63. }
  64. // MustOpen maximize trying to open the file
  65. func MustOpen(fileName, filePath string) (*os.File, error) {
  66. //dir, err := os.Getwd()
  67. //if err != nil {
  68. // return nil, fmt.Errorf("os.Getwd err: %v", err)
  69. //}
  70. src := filePath
  71. perm := CheckPermission(src)
  72. if perm == true {
  73. return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
  74. }
  75. err := IsNotExistMkDir(src)
  76. if err != nil {
  77. return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
  78. }
  79. f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
  80. if err != nil {
  81. return nil, fmt.Errorf("Fail to OpenFile :%v", err)
  82. }
  83. return f, nil
  84. }
  85. // 判断所给路径文件/文件夹是否存在
  86. func Exists(path string) bool {
  87. _, err := os.Stat(path) //os.Stat获取文件信息
  88. if err != nil {
  89. if os.IsExist(err) {
  90. return true
  91. }
  92. return false
  93. }
  94. return true
  95. }
  96. // 判断所给路径是否为文件夹
  97. func IsDir(path string) bool {
  98. s, err := os.Stat(path)
  99. if err != nil {
  100. return false
  101. }
  102. return s.IsDir()
  103. }
  104. // 判断所给路径是否为文件
  105. func IsFile(path string) bool {
  106. return !IsDir(path)
  107. }
  108. func CreateFile(path string) error {
  109. file, err := os.Create(path)
  110. if err != nil {
  111. return err
  112. }
  113. defer file.Close()
  114. return nil
  115. }
  116. // IsNotExistMkDir create a directory if it does not exist
  117. func IsNotExistCreateFile(src string) error {
  118. if notExist := CheckNotExist(src); notExist == true {
  119. if err := CreateFile(src); err != nil {
  120. return err
  121. }
  122. }
  123. return nil
  124. }
  125. func ReadFullFile(path string) []byte {
  126. file, err := os.Open(path)
  127. if err != nil {
  128. return []byte("")
  129. }
  130. defer file.Close()
  131. content, err := ioutil.ReadAll(file)
  132. if err != nil {
  133. return []byte("")
  134. }
  135. return content
  136. }
  137. // File copies a single file from src to dst
  138. func CopyFile(src, dst string) error {
  139. var err error
  140. var srcfd *os.File
  141. var dstfd *os.File
  142. var srcinfo os.FileInfo
  143. if srcfd, err = os.Open(src); err != nil {
  144. return err
  145. }
  146. defer srcfd.Close()
  147. if dstfd, err = os.Create(dst); err != nil {
  148. return err
  149. }
  150. defer dstfd.Close()
  151. if _, err = io.Copy(dstfd, srcfd); err != nil {
  152. return err
  153. }
  154. if srcinfo, err = os.Stat(src); err != nil {
  155. return err
  156. }
  157. return os.Chmod(dst, srcinfo.Mode())
  158. }
  159. // Dir copies a whole directory recursively
  160. func CopyDir(src string, dst string) error {
  161. var err error
  162. var fds []os.FileInfo
  163. var srcinfo os.FileInfo
  164. if srcinfo, err = os.Stat(src); err != nil {
  165. return err
  166. }
  167. if !srcinfo.IsDir() {
  168. if err = CopyFile(src, dst); err != nil {
  169. fmt.Println(err)
  170. }
  171. return nil
  172. }
  173. if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
  174. return err
  175. }
  176. if fds, err = ioutil.ReadDir(src); err != nil {
  177. return err
  178. }
  179. for _, fd := range fds {
  180. srcfp := path.Join(src, fd.Name())
  181. dstfp := path.Join(dst, fd.Name())
  182. if fd.IsDir() {
  183. if err = CopyDir(srcfp, dstfp); err != nil {
  184. fmt.Println(err)
  185. }
  186. } else {
  187. if err = CopyFile(srcfp, dstfp); err != nil {
  188. fmt.Println(err)
  189. }
  190. }
  191. }
  192. return nil
  193. }