1. 程式人生 > >Go實戰--golang中檔案以及資料夾路徑相關操作

Go實戰--golang中檔案以及資料夾路徑相關操作

生命不止,繼續 go go go!!!

之前介紹過golang的標準庫:path/filepath, os

今天就跟大家分享幾個關於檔案以及資料夾的相關操作。

獲取目錄中所有檔案

使用包:
io/ioutil

使用方法:
ioutil.ReadDir
讀取目錄 dirmane 中的所有目錄和檔案(不包括子目錄)
返回讀取到的檔案的資訊列表和讀取過程中遇到的任何錯誤
返回的檔案列表是經過排序的

FileInfo

type FileInfo interface {
        Name() string       // base name of the file
        Size() int64
// length in bytes for regular files; system-dependent for others Mode() FileMode // file mode bits ModTime() time.Time // modification time IsDir() bool // abbreviation for Mode().IsDir() Sys() interface{} // underlying data source (can return nil) }

程式碼:

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    myfolder := `d:\go_workspace\`

    files, _ := ioutil.ReadDir(myfolder)
    for _, file := range files {
        if file.IsDir() {
            continue
        } else {
            fmt.Println(file.Name())
        }
    }
}

獲取目錄以及子目錄中所有檔案

在上面程式碼的基礎上,使用遞迴,遍歷所有的資料夾和子資料夾。

程式碼:

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    myfolder := `d:\go_workspace\`
    listFile(myfolder)
}

func listFile(myfolder string) {
    files, _ := ioutil.ReadDir(myfolder)
    for _, file := range files {
        if file.IsDir() {
            listFile(myfolder + "/" + file.Name())
        } else {
            fmt.Println(myfolder + "/" + file.Name())
        }
    }
}

獲取執行檔案所在目錄

程式碼1:
使用包:
path/filepath
os

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(dir)
}

程式碼2:
使用包:
path/filepath
os

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    exPath := filepath.Dir(ex)
    fmt.Println(exPath)
}

程式碼3:
使用包:
os

package main

import (
    "fmt"
    "os"
)

func main() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}

程式碼4:
使用包:
path/filepath

package main

import (
    "fmt"
    "path/filepath"
)

func main() {

    fmt.Println(filepath.Abs("./"))
}
package main

import (
    "fmt"
    "log"

    "github.com/kardianos/osext"
)

func main() {
    folderPath, err := osext.ExecutableFolder()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(folderPath)
}

顯示所有資料夾、子資料夾、檔案、子檔案

使用包:
path/filepath
os

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func visit(path string, f os.FileInfo, err error) error {
    fmt.Printf("Visited: %s\n", path)
    return nil
}

func main() {
    root := `d:\go_workspace\`
    err := filepath.Walk(root, visit)
    fmt.Printf("filepath.Walk() returned %v\n", err)
}

獲取資料夾中所有檔案以及檔案的大小

使用包:
path/filepath
os

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    dirname := "." + string(filepath.Separator)
    d, err := os.Open(dirname)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    defer d.Close()
    fi, err := d.Readdir(-1)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    for _, fi := range fi {
        if fi.Mode().IsRegular() {
            fmt.Println(fi.Name(), fi.Size(), "bytes")
        }
    }
}

重新命名檔案

package main

import (
    "log"
    "os"
)

func main() {
    originalPath := "./test.txt"
    newPath := "test_new.txt"
    err := os.Rename(originalPath, newPath)
    if err != nil {
        log.Fatal(err)
    }
}

重新命名資料夾

package main

import (
    "log"
    "os"
)

func main() {
    originalPath := "test"
    newPath := "test_new"
    err := os.Rename(originalPath, newPath)
    if err != nil {
        log.Fatal(err)
    }
}

判斷某個檔案是否存在

package main

import (
    "fmt"
    "os"
)

func main() {
    originalPath := "test.txt"
    result := Exists(originalPath)
    fmt.Println(result)
}

func Exists(name string) bool {
    if _, err := os.Stat(name); err != nil {
        if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

判斷某個檔案的讀寫許可權

package main

import (
    "log"
    "os"
)

func main() {

    //Write permission
    file, err := os.OpenFile("./test.txt", os.O_WRONLY, 0666)
    if err != nil {
        if os.IsPermission(err) {
            log.Println("Error: Write permission denied.")
        }
    }
    file.Close()

    //Read permission
    file, err = os.OpenFile("./test.txt", os.O_RDONLY, 0666)
    if err != nil {
        if os.IsPermission(err) {
            log.Println("Error: Read permission denied.")
        }
    }
    file.Close()
}

這裡寫圖片描述