u_io.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package util
  2. import (
  3. "fmt"
  4. "io"
  5. "io/fs"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "sort"
  10. "strings"
  11. )
  12. // 检查文件是否存在,如果存在则删除它,不返回错误
  13. func DeleteFileIfExists(filePath string) {
  14. // 使用Stat函数检查文件是否存在
  15. fileInfo, err := os.Stat(filePath)
  16. if err != nil {
  17. // 如果Stat返回错误,且错误是因为文件不存在,则忽略
  18. if os.IsNotExist(err) {
  19. fmt.Println("文件不存在:", filePath)
  20. return
  21. }
  22. // 如果错误不是文件不存在,则记录或处理错误
  23. fmt.Println("获取文件信息时出错:", err)
  24. // 这里可以根据需要添加更多的错误处理逻辑,但按照要求我们不返回错误
  25. return
  26. }
  27. // 如果文件存在,则检查是否为文件(虽然大多数情况下会是文件,但最好还是检查一下)
  28. if !fileInfo.IsDir() {
  29. // 调用Remove函数删除文件
  30. err := os.Remove(filePath)
  31. if err != nil {
  32. // 删除文件时出错,记录或处理错误
  33. fmt.Println("删除文件时出错:", err)
  34. // 这里可以根据需要添加更多的错误处理逻辑,但按照要求我们不返回错误
  35. } else {
  36. fmt.Println("文件已删除:", filePath)
  37. }
  38. } else {
  39. fmt.Println(filePath, "是一个目录,不是文件")
  40. }
  41. }
  42. // 将指定的目录和子目录压缩成 ZIP 文件
  43. func ZipDir(src string, dest string, dirs []string) error {
  44. // 创建 zip 命令参数
  45. args := []string{"-r", dest}
  46. for _, dir := range dirs {
  47. args = append(args, dir)
  48. }
  49. // 创建 zip 命令
  50. cmd := exec.Command("zip", args...)
  51. // 设置工作目录
  52. cmd.Dir = src
  53. // 执行 zip 命令并获取输出
  54. output, err := cmd.CombinedOutput()
  55. if err != nil {
  56. return fmt.Errorf("执行压缩命令【%v】报错【%v】输出【%v】", args, err, output)
  57. }
  58. fmt.Printf("执行压缩命令【%v】成功", args)
  59. return nil
  60. }
  61. func GetFileSize(filePath string) (int, error) {
  62. fileInfo, err := os.Stat(filePath)
  63. if err != nil {
  64. return 0, err
  65. }
  66. return int(fileInfo.Size()), nil
  67. }
  68. func CheckSoFilesInDirectory(dirPath string) (bool, []string) {
  69. hasSoFile := false
  70. soFilePaths := make([]string, 0)
  71. if _, err := os.Stat(dirPath); os.IsNotExist(err) {
  72. fmt.Println("Directory does not exist:", dirPath)
  73. return false, soFilePaths
  74. }
  75. err := filepath.Walk(dirPath, func(path string, info fs.FileInfo, err error) error {
  76. if err != nil {
  77. return err
  78. }
  79. if info.IsDir() {
  80. return nil
  81. }
  82. if filepath.Ext(path) == ".so" {
  83. hasSoFile = true
  84. soFilePaths = append(soFilePaths, path)
  85. }
  86. return nil
  87. })
  88. if err != nil {
  89. fmt.Println("Error walking the directory:", err)
  90. os.Exit(1)
  91. }
  92. return hasSoFile, soFilePaths
  93. }
  94. func GetFirstLevelSubdirectories(dirPath string) []string {
  95. dirEntries, _ := os.ReadDir(dirPath)
  96. subdirectories := make([]string, 0)
  97. for _, entry := range dirEntries {
  98. if entry.IsDir() {
  99. subdirectories = append(subdirectories, entry.Name())
  100. }
  101. }
  102. return subdirectories
  103. }
  104. func GetFileNameWithoutExtension(absPath string) string {
  105. file := filepath.Base(absPath)
  106. ext := filepath.Ext(file)
  107. return strings.TrimSuffix(file, ext)
  108. }
  109. func GetSoFilePaths(dir string) []string {
  110. var paths []string
  111. err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
  112. if err == nil && !info.IsDir() && filepath.Ext(path) == ".so" {
  113. absPath, _ := filepath.Abs(path)
  114. paths = append(paths, absPath)
  115. }
  116. return nil
  117. })
  118. if err != nil {
  119. fmt.Println("Error:", err)
  120. return nil
  121. }
  122. return paths
  123. }
  124. // CreateDir 创建目录
  125. func CreateDir(directory string) {
  126. if _, err := os.Stat(directory); os.IsNotExist(err) {
  127. _ = os.MkdirAll(directory, os.ModePerm)
  128. }
  129. }
  130. // CreateParentDir 存在不创建,不存在则创建父目录
  131. func CreateParentDir(filePath string) error {
  132. if err := os.MkdirAll(filepath.Dir(filePath), os.ModePerm); err != nil {
  133. return err
  134. }
  135. return nil
  136. }
  137. // RemoveDir 递归删除目录及其下的所有文件和子目录
  138. func RemoveDir(dirPath string) error {
  139. // 打开目录
  140. dir, err := os.Open(dirPath)
  141. if err != nil {
  142. return err
  143. }
  144. defer dir.Close()
  145. // 读取目录下的文件和子目录
  146. fileInfos, err := dir.Readdir(-1)
  147. if err != nil {
  148. return err
  149. }
  150. // 遍历文件和子目录
  151. for _, fileInfo := range fileInfos {
  152. path := filepath.Join(dirPath, fileInfo.Name())
  153. if fileInfo.IsDir() {
  154. // 如果是子目录,递归调用removeDir删除子目录及其下的文件和子目录
  155. if err = RemoveDir(path); err != nil {
  156. return err
  157. }
  158. } else {
  159. // 如果是文件,直接删除文件
  160. if err = os.Remove(path); err != nil {
  161. return err
  162. }
  163. }
  164. }
  165. // 删除目录本身
  166. if err = os.Remove(dirPath); err != nil {
  167. return err
  168. }
  169. return nil
  170. }
  171. // RemoveSubFiles 递归删除目录及其下的所有文件和子目录
  172. func RemoveSubFiles(dirPath string) error {
  173. // 打开目录
  174. dir, err := os.Open(dirPath)
  175. if err != nil {
  176. return err
  177. }
  178. defer dir.Close()
  179. // 读取目录下的文件和子目录
  180. fileInfos, err := dir.Readdir(-1)
  181. if err != nil {
  182. return err
  183. }
  184. // 遍历文件和子目录
  185. for _, fileInfo := range fileInfos {
  186. path := filepath.Join(dirPath, fileInfo.Name())
  187. if fileInfo.IsDir() {
  188. // 如果是子目录,递归调用removeDir删除子目录及其下的文件和子目录
  189. if err = RemoveDir(path); err != nil {
  190. return err
  191. }
  192. } else {
  193. // 如果是文件,直接删除文件
  194. if err = os.Remove(path); err != nil {
  195. return err
  196. }
  197. }
  198. }
  199. return nil
  200. }
  201. func WriteFile(sourceContent string, targetFilePath string) error {
  202. if err := CreateFile(targetFilePath); err != nil {
  203. return err
  204. }
  205. if err := os.WriteFile(targetFilePath, []byte(sourceContent), 0644); err != nil {
  206. return err
  207. }
  208. return nil
  209. }
  210. // CreateFile 存在则覆盖,不存在则创建文件
  211. func CreateFile(filePath string) error {
  212. if err := CreateParentDir(filePath); err != nil {
  213. return err
  214. }
  215. // 创建文件,如果文件已存在则覆盖
  216. file, err := os.Create(filePath)
  217. if err != nil {
  218. return err
  219. }
  220. defer func(file *os.File) {
  221. err := file.Close()
  222. if err != nil {
  223. }
  224. }(file)
  225. return nil
  226. }
  227. func ReadFile(filePath string) (string, error) {
  228. // 1 打开文件
  229. file, err := os.Open(filePath)
  230. if err != nil {
  231. return "", err
  232. }
  233. defer file.Close()
  234. // 2 读取文件内容
  235. content, err := io.ReadAll(file)
  236. if err != nil {
  237. return "", err
  238. }
  239. return string(content), err
  240. }
  241. func ListAbsolutePathWithSuffixAndSort(dir string, suffix string) ([]string, error) {
  242. var result []string
  243. if !strings.HasSuffix(dir, "/") {
  244. dir = dir + "/"
  245. }
  246. files, err := os.ReadDir(dir)
  247. if err != nil {
  248. return nil, err
  249. }
  250. for _, file := range files {
  251. if strings.HasSuffix(file.Name(), suffix) {
  252. result = append(result, dir+file.Name())
  253. }
  254. }
  255. // 根据文件名进行升序排序
  256. sort.Slice(result, func(i, j int) bool {
  257. return filepath.Base(result[i]) < filepath.Base(result[j])
  258. })
  259. return result, nil
  260. }
  261. func DeleteFile(path string) error {
  262. // 检查文件是否存在
  263. if _, err := os.Stat(path); err == nil {
  264. // 文件存在,执行删除操作
  265. err = os.Remove(path)
  266. if err != nil {
  267. return err
  268. }
  269. }
  270. return nil
  271. }
  272. // WriteStringToFile 将字符串写入指定的文件路径
  273. func WriteStringToFile(content string, filePath string) {
  274. // 方法一:使用os包
  275. file, err := os.Create(filePath)
  276. if err != nil {
  277. fmt.Println("创建文件失败:", err)
  278. return
  279. }
  280. defer file.Close()
  281. _, err = file.WriteString(content)
  282. if err != nil {
  283. fmt.Println("写入文件失败:", err)
  284. return
  285. }
  286. fmt.Println("字符串成功写入文件(os包)")
  287. }