directory.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package gio
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. )
  9. type Directory struct {
  10. Path string
  11. Name string
  12. //Children []Directory
  13. //Files []File
  14. }
  15. // GetFilesAll 获取文件夹中的文件(包含子文件夹)
  16. func (d *Directory) GetFilesAll() []File {
  17. return nil
  18. }
  19. // GetChildrenDirs 获取子文件夹
  20. func (d *Directory) GetChildrenDirs() []Directory {
  21. var dirs []Directory
  22. // 读取目录内容
  23. files, err := os.ReadDir(d.Path)
  24. if err != nil {
  25. fmt.Println("Error:", err)
  26. return nil
  27. }
  28. // 遍历第一层子目录
  29. for _, file := range files {
  30. if file.IsDir() {
  31. //fmt.Println("Dir:", file.Name())
  32. dirs = append(dirs, Directory{Path: d.Path + string(os.PathSeparator) + file.Name(), Name: file.Name()})
  33. }
  34. //else {
  35. // fmt.Println("File:", file.Name())
  36. //}
  37. }
  38. if len(dirs) == 0 {
  39. return nil
  40. }
  41. return dirs
  42. }
  43. // CopyFile 使用io.Copy进行文件的复制,同时也会复制文件的所有权限
  44. // @param src 复制文件
  45. // @param des 目标文件
  46. // @return error 错误信息
  47. func CopyFile(src, des string) error {
  48. // 判断文件是否存在
  49. if !IsExist(src) {
  50. return errors.New("要复制的文件不存在")
  51. }
  52. // 打开文件
  53. srcFile, err := os.Open(src)
  54. if err != nil {
  55. return err
  56. }
  57. defer func(srcFile *os.File) {
  58. err := srcFile.Close()
  59. if err != nil {
  60. }
  61. }(srcFile)
  62. // 获取源文件的权限
  63. fi, _ := srcFile.Stat()
  64. perm := fi.Mode()
  65. // 创建目标文件,并复制源文件的所有权限
  66. desFile, err := os.OpenFile(des, os.O_RDWR|os.O_CREATE|os.O_TRUNC, perm)
  67. if err != nil {
  68. return err
  69. }
  70. defer desFile.Close()
  71. // 进行复制
  72. _, err = io.Copy(desFile, srcFile)
  73. // 返回
  74. return err
  75. }
  76. func moveDir(sourceDir string, targetDir string) error {
  77. fs, err := os.ReadDir(sourceDir)
  78. if err == nil {
  79. //遍历当前文件夹
  80. for _, f := range fs {
  81. //判断是否是文件夹
  82. if f.IsDir() {
  83. err = moveDir(sourceDir+string(os.PathSeparator)+f.Name(), targetDir+string(os.PathSeparator)+f.Name())
  84. if err != nil {
  85. return err
  86. }
  87. } else {
  88. //判断到是文件
  89. //创建文件夹
  90. _ = os.Mkdir(targetDir, os.ModePerm)
  91. //使用重命名方法移动文件
  92. err := os.Rename(sourceDir+string(os.PathSeparator)+f.Name(), targetDir+string(os.PathSeparator)+f.Name())
  93. if err != nil {
  94. return err
  95. }
  96. }
  97. }
  98. }
  99. fs2, err := os.ReadDir(sourceDir)
  100. if err == nil {
  101. if len(fs2) == 0 {
  102. _ = os.Remove(sourceDir)
  103. }
  104. } else {
  105. return err
  106. }
  107. return nil
  108. }
  109. func copyDir(sourceDir string, targetDir string) error {
  110. fs, err := os.ReadDir(sourceDir)
  111. if err == nil {
  112. //遍历当前文件夹
  113. for _, f := range fs {
  114. //判断是否是文件夹
  115. if f.IsDir() {
  116. err = moveDir(sourceDir+string(os.PathSeparator)+f.Name(), targetDir+string(os.PathSeparator)+f.Name())
  117. if err != nil {
  118. return err
  119. }
  120. } else {
  121. //判断到是文件
  122. //创建文件夹
  123. _ = os.Mkdir(targetDir, os.ModePerm)
  124. //使用重命名方法移动文件
  125. err := CopyFile(sourceDir+string(os.PathSeparator)+f.Name(), targetDir+string(os.PathSeparator)+f.Name())
  126. if err != nil {
  127. return err
  128. }
  129. }
  130. }
  131. }
  132. return nil
  133. }
  134. // Move 移动文件夹
  135. func (d *Directory) Move(targetDir string) error {
  136. err := moveDir(d.Path, targetDir)
  137. return err
  138. }
  139. // Copy 复制文件夹
  140. func (d *Directory) Copy(targetDir string) error {
  141. err := moveDir(d.Path, targetDir)
  142. return err
  143. }
  144. func deleteall(path string) error {
  145. fs, err := os.ReadDir(path)
  146. if err == nil {
  147. //遍历当前文件夹
  148. for _, f := range fs {
  149. //判断是否是文件夹
  150. if f.IsDir() {
  151. deleteall(path + string(os.PathSeparator) + f.Name())
  152. } else {
  153. //删除文件
  154. _ = os.Remove(path + string(os.PathSeparator) + f.Name())
  155. }
  156. }
  157. }
  158. _ = os.Remove(path)
  159. if IsExist(path) {
  160. return nil
  161. } else {
  162. return errors.New("无法删除该文件夹")
  163. }
  164. }
  165. // DeleteAll 删除当前文件夹的所有内容
  166. func (d *Directory) DeleteAll() error {
  167. return deleteall(d.Path)
  168. }
  169. // Rename 重命名文件夹
  170. func (d *Directory) Rename(newName string) error {
  171. return os.Rename(d.Path, filepath.Dir(d.Path)+string(os.PathSeparator)+newName)
  172. }
  173. // GetParent 获取父级文件夹路径
  174. func (d *Directory) GetParent() string {
  175. return filepath.Dir(d.Path)
  176. }
  177. // GetFile 通过文件名获取文件
  178. func (d *Directory) GetFile(name string) ([]*File, error) {
  179. return nil, nil
  180. }
  181. // GetDir 通过文件夹名获取文件夹
  182. func (d *Directory) GetDir(name string) ([]*Directory, error) {
  183. return nil, nil
  184. }
  185. // GetALLDir 获取当前目录所有的子文件夹
  186. func (d *Directory) GetALLDir() []*Directory {
  187. var dirs []*Directory
  188. fs, err := os.ReadDir(d.Path)
  189. if err == nil {
  190. //遍历当前文件夹
  191. for _, f := range fs {
  192. //判断是否是文件夹
  193. if f.IsDir() {
  194. dirs = append(dirs, OpenDir(d.Path+string(os.PathSeparator)+f.Name()))
  195. }
  196. }
  197. }
  198. return dirs
  199. }
  200. func getallfile(path string) []*File {
  201. var files []*File
  202. fs, err := os.ReadDir(path)
  203. if err == nil {
  204. //遍历当前文件夹
  205. for _, f := range fs {
  206. //判断是否是文件夹
  207. if f.IsDir() {
  208. tfs := getallfile(path + string(os.PathSeparator) + f.Name())
  209. for _, v := range tfs {
  210. files = append(files, v)
  211. }
  212. } else {
  213. tf, _ := OpenFile(path + string(os.PathSeparator) + f.Name())
  214. if tf != nil {
  215. files = append(files, tf)
  216. }
  217. }
  218. }
  219. }
  220. return files
  221. }
  222. // GetALLDir 获取当前目录所有的子文件夹
  223. func (d *Directory) GetAllFile(isSearchSubDir bool) []*File {
  224. if isSearchSubDir {
  225. return getallfile(d.Path)
  226. } else {
  227. var files []*File
  228. fs, err := os.ReadDir(d.Path)
  229. if err == nil {
  230. //遍历当前文件夹
  231. for _, f := range fs {
  232. //判断是否是文件夹
  233. if !f.IsDir() {
  234. tf, _ := OpenFile(d.Path + string(os.PathSeparator) + f.Name())
  235. if tf != nil {
  236. files = append(files, tf)
  237. }
  238. }
  239. }
  240. }
  241. return files
  242. }
  243. }
  244. // OpenDir 打开文件夹
  245. func OpenDir(path string) *Directory {
  246. d := Directory{Path: path, Name: filepath.Base(path)}
  247. return &d
  248. }
  249. //// IsExistDir 判断文件夹是否存在
  250. //func IsExistDir(path string) bool {
  251. //
  252. // return false
  253. //}
  254. // IsExist 判断是否存在
  255. func IsExist(path string) bool {
  256. existed := true
  257. if _, err := os.Stat(path); os.IsNotExist(err) {
  258. existed = false
  259. }
  260. return existed
  261. }
  262. // CreateDir 创建文件夹
  263. func CreateDir(path string) error {
  264. // 使用Mkdir创建文件夹
  265. err := os.Mkdir(path, os.ModePerm)
  266. if err != nil {
  267. // 如果文件夹已存在,也可以选择忽略错误
  268. if !os.IsExist(err) {
  269. return nil
  270. }
  271. return err
  272. }
  273. return nil
  274. }