file.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package file
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "mime/multipart"
  8. "os"
  9. "path"
  10. "strconv"
  11. "strings"
  12. )
  13. // GetSize get the file size
  14. func GetSize(f multipart.File) (int, error) {
  15. content, err := ioutil.ReadAll(f)
  16. return len(content), err
  17. }
  18. // GetExt get the file ext
  19. func GetExt(fileName string) string {
  20. return path.Ext(fileName)
  21. }
  22. // CheckNotExist check if the file exists
  23. func CheckNotExist(src string) bool {
  24. _, err := os.Stat(src)
  25. return os.IsNotExist(err)
  26. }
  27. // CheckPermission check if the file has permission
  28. func CheckPermission(src string) bool {
  29. _, err := os.Stat(src)
  30. return os.IsPermission(err)
  31. }
  32. // IsNotExistMkDir create a directory if it does not exist
  33. func IsNotExistMkDir(src string) error {
  34. if notExist := CheckNotExist(src); notExist == true {
  35. if err := MkDir(src); err != nil {
  36. return err
  37. }
  38. }
  39. return nil
  40. }
  41. // MkDir create a directory
  42. func MkDir(src string) error {
  43. err := os.MkdirAll(src, os.ModePerm)
  44. if err != nil {
  45. return err
  46. }
  47. os.Chmod(src, 0777)
  48. return nil
  49. }
  50. // RMDir remove a directory
  51. func RMDir(src string) error {
  52. err := os.RemoveAll(src)
  53. if err != nil {
  54. return err
  55. }
  56. os.Remove(src)
  57. return nil
  58. }
  59. // Open a file according to a specific mode
  60. func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
  61. f, err := os.OpenFile(name, flag, perm)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return f, nil
  66. }
  67. // MustOpen maximize trying to open the file
  68. func MustOpen(fileName, filePath string) (*os.File, error) {
  69. //dir, err := os.Getwd()
  70. //if err != nil {
  71. // return nil, fmt.Errorf("os.Getwd err: %v", err)
  72. //}
  73. src := filePath
  74. perm := CheckPermission(src)
  75. if perm == true {
  76. return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
  77. }
  78. err := IsNotExistMkDir(src)
  79. if err != nil {
  80. return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
  81. }
  82. f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
  83. if err != nil {
  84. return nil, fmt.Errorf("Fail to OpenFile :%v", err)
  85. }
  86. return f, nil
  87. }
  88. // 判断所给路径文件/文件夹是否存在
  89. func Exists(path string) bool {
  90. _, err := os.Stat(path) //os.Stat获取文件信息
  91. if err != nil {
  92. if os.IsExist(err) {
  93. return true
  94. }
  95. return false
  96. }
  97. return true
  98. }
  99. // 判断所给路径是否为文件夹
  100. func IsDir(path string) bool {
  101. s, err := os.Stat(path)
  102. if err != nil {
  103. return false
  104. }
  105. return s.IsDir()
  106. }
  107. // 判断所给路径是否为文件
  108. func IsFile(path string) bool {
  109. return !IsDir(path)
  110. }
  111. func CreateFile(path string) error {
  112. file, err := os.Create(path)
  113. if err != nil {
  114. return err
  115. }
  116. defer file.Close()
  117. return nil
  118. }
  119. func CreateFileAndWriteContent(path string, content string) error {
  120. file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE, 0666)
  121. if err != nil {
  122. return err
  123. }
  124. defer file.Close()
  125. write := bufio.NewWriter(file)
  126. write.WriteString(content)
  127. write.Flush()
  128. return nil
  129. }
  130. // IsNotExistMkDir create a directory if it does not exist
  131. func IsNotExistCreateFile(src string) error {
  132. if notExist := CheckNotExist(src); notExist == true {
  133. if err := CreateFile(src); err != nil {
  134. return err
  135. }
  136. }
  137. return nil
  138. }
  139. func ReadFullFile(path string) []byte {
  140. file, err := os.Open(path)
  141. if err != nil {
  142. return []byte("")
  143. }
  144. defer file.Close()
  145. content, err := ioutil.ReadAll(file)
  146. if err != nil {
  147. return []byte("")
  148. }
  149. return content
  150. }
  151. // File copies a single file from src to dst
  152. func CopyFile(src, dst string) error {
  153. var err error
  154. var srcfd *os.File
  155. var dstfd *os.File
  156. var srcinfo os.FileInfo
  157. lastPath := src[strings.LastIndex(src, "/")+1:]
  158. if !strings.HasSuffix(dst, "/") {
  159. dst += "/"
  160. }
  161. dstPath := dst
  162. dst += lastPath
  163. for i := 0; Exists(dst); i++ {
  164. name := strings.Split(lastPath, ".")
  165. nameIndex := 0
  166. if len(name) > 2 {
  167. nameIndex = len(name) - 2
  168. }
  169. name[nameIndex] = name[nameIndex] + strconv.Itoa(i+1)
  170. dst = dstPath
  171. for _, v := range name {
  172. dst += v + "."
  173. }
  174. dst = strings.TrimSuffix(dst, ".")
  175. }
  176. if srcfd, err = os.Open(src); err != nil {
  177. return err
  178. }
  179. defer srcfd.Close()
  180. if dstfd, err = os.Create(dst); err != nil {
  181. return err
  182. }
  183. defer dstfd.Close()
  184. if _, err = io.Copy(dstfd, srcfd); err != nil {
  185. return err
  186. }
  187. if srcinfo, err = os.Stat(src); err != nil {
  188. return err
  189. }
  190. return os.Chmod(dst, srcinfo.Mode())
  191. }
  192. // Dir copies a whole directory recursively
  193. func CopyDir(src string, dst string) error {
  194. var err error
  195. var fds []os.FileInfo
  196. var srcinfo os.FileInfo
  197. if srcinfo, err = os.Stat(src); err != nil {
  198. return err
  199. }
  200. if !srcinfo.IsDir() {
  201. if err = CopyFile(src, dst); err != nil {
  202. fmt.Println(err)
  203. }
  204. return nil
  205. }
  206. dstPath := dst
  207. lastPath := src[strings.LastIndex(src, "/")+1:]
  208. dst += "/" + lastPath
  209. for i := 0; Exists(dst); i++ {
  210. dst = dstPath + "/" + lastPath + strconv.Itoa(i+1)
  211. }
  212. if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
  213. return err
  214. }
  215. if fds, err = ioutil.ReadDir(src); err != nil {
  216. return err
  217. }
  218. for _, fd := range fds {
  219. srcfp := path.Join(src, fd.Name())
  220. dstfp := dst //path.Join(dst, fd.Name())
  221. if fd.IsDir() {
  222. if err = CopyDir(srcfp, dstfp); err != nil {
  223. fmt.Println(err)
  224. }
  225. } else {
  226. if err = CopyFile(srcfp, dstfp); err != nil {
  227. fmt.Println(err)
  228. }
  229. }
  230. }
  231. return nil
  232. }
  233. //文件写入临时目录
  234. func WriteToPath(data []byte, path, name string) error {
  235. fullPath := path
  236. if strings.HasSuffix(path, "/") {
  237. fullPath += name
  238. } else {
  239. fullPath += "/" + name
  240. }
  241. IsNotExistCreateFile(fullPath)
  242. file, err := os.OpenFile(fullPath,
  243. os.O_WRONLY|os.O_TRUNC|os.O_CREATE,
  244. 0666,
  245. )
  246. if err != nil {
  247. return err
  248. }
  249. defer file.Close()
  250. _, err = file.Write(data)
  251. return err
  252. }
  253. //最终拼接
  254. func SpliceFiles(dir, path string, length int) error {
  255. fullPath := path
  256. IsNotExistCreateFile(fullPath)
  257. file, _ := os.OpenFile(fullPath,
  258. os.O_WRONLY|os.O_TRUNC|os.O_CREATE,
  259. 0666,
  260. )
  261. defer file.Close()
  262. bufferedWriter := bufio.NewWriter(file)
  263. for i := 0; i < length; i++ {
  264. data, err := ioutil.ReadFile(path + strconv.Itoa(i))
  265. if err != nil {
  266. return err
  267. }
  268. _, err = bufferedWriter.Write(data)
  269. if err != nil {
  270. return err
  271. }
  272. }
  273. bufferedWriter.Flush()
  274. return nil
  275. }