package main
import (
"fmt"
"io/fs"
"io/ioutil"
"os"
"path"
"path/filepath"
)
func main() {
// 文件和路徑相關的功能包含了:os、path、filepath、ioutil包
// 1. 創建文件夾
// (1)創建單層目錄,已存在則err有錯
err := os.Mkdir("x2", 0755)
fmt.Println(err)
// (2)創建多級目錄,已存在則什么都不做
err2 := os.MkdirAll("t2/src/code/test", 0755)
fmt.Println(err2)
// 另一種寫法
if err3 := os.Mkdir("x2", 0755); err3 == nil {
fmt.Println("文件夾x2創建成功")
} else {
fmt.Println(err)
}
if err4 := os.MkdirAll("t2/src/code/test/xxx.go", 0755); err4 == nil {
fmt.Println("文件夾t2/src/code/test創建成功")
} else {
fmt.Println(err)
}
// 2. 刪除文件和文件夾
// (1)刪除文件或空文件夾,文件夾下存在文件則報錯
if err5 := os.Remove("x2"); err5 != nil {
fmt.Println("刪除失敗", err5)
} else {
fmt.Println("刪除成功")
}
// (2) 刪除文件或文件夾(同時刪除子目錄)
if err6 := os.RemoveAll("t1"); err6 != nil {
fmt.Println("刪除失敗", err6)
} else {
fmt.Println("刪除成功")
}
// 3. 路徑是否存在
// 判斷文件或文件夾是否存在
_, err7 := os.Stat("t2/src/code/test/xxx.go")
if err7 != nil {
// err7錯誤產生的原因有可能是不存在或者別的,所以需要再次判斷一下是不存在導致的
if os.IsNotExist(err7) {
fmt.Println("文件或文件夾不存在")
}
} else {
fmt.Println("文件或文件夾已存在")
}
// 4. 是否是文件夾
fileObject, _ := os.Stat("t2/src/code/test")
result := fileObject.IsDir()
fmt.Println(result)
// 5. 生成絕對路徑
absPath, _ := filepath.Abs("t2/src")
fmt.Println(absPath)
// 6. 獲取上級目錄
absPath2, _ := filepath.Abs("t2")
fmt.Println(absPath2)
basePath := filepath.Dir(filepath.Dir(absPath2))
fmt.Println(basePath)
// 7. 遍歷目錄(一級)
fileList, _ := ioutil.ReadDir("t2")
for _, obj := range fileList {
fmt.Println(obj.Name())
}
// 8. 遍歷目錄(多級)
filepath.Walk("t2", func(path string, info fs.FileInfo, err error) error {
if !info.IsDir() {
fmt.Println("文件有", path)
}
return nil
})
// 9. 路徑拼接
filePath2 := path.Join("v1", "v2", "v3/v4", "v6.exe")
fmt.Println(filePath2)
// 10. 文件擴展名
ext := path.Ext("/xxxx/xxx/xx/xx.txt")
fmt.Println(ext)
}
2. 獲取一個文件夾下所有的文件路徑,獲取一個路徑的最后文件名
package main
import (
"fmt"
"path/filepath"
)
func main() {
templatesDir := "./templates"
// filepath.Glob 獲取一個文件夾下所有的文件路徑切片
adminLayouts, _ := filepath.Glob(templatesDir + "/layouts/*")
fmt.Println(adminLayouts)
// 輸出: [templates\layouts\base_admins.html templates\layouts\base_articles.html]
adminInclude, _ := filepath.Glob(templatesDir + "/articles/*")
for _, include := range adminInclude {
layoutCopy := make([]string, len(adminLayouts))
copy(layoutCopy, adminLayouts)
files := append(layoutCopy, include)
fmt.Println(files)
// 輸出:[templates\layouts\base_admins.html templates\layouts\base_articles.html templates\articles\article.html]
// 輸出:[templates\layouts\base_admins.html templates\layouts\base_articles.html templates\articles\index.html]
// filepath.Base 獲取一個路徑的最后文件名
fmt.Println(filepath.Base(include))
// 輸出:article.html
// 輸出:index.html
}
}