如何在 Go 中操作檔案

更新 發佈閱讀 14 分鐘


raw-image

👨‍💻 簡介

今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。

檔案和資料夾操作

os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。

建立相關操作

  • os.Create:建立一個新檔案。
  • os.Mkdir:建立一個新資料夾。
  • os.MkdirAll:建立資料夾,包括必要的父層資料夾。

語法如下:

func os.Create(name string) (*os.File, error)
func os.Mkdir(name string, perm fs.FileMode) error
func os.MkdirAll(path string, perm fs.FileMode) error
package main

import (
"fmt"
"os"
"io"
)

func main() {

// 建立資料夾,指定權限為755
err := os.Mkdir("mydir", 0755)
if err != nil {
fmt.Println("Error creating directory:", err)
} else {
fmt.Println("Directory created successfully.")
}

// 建立一個新檔案並寫入內容
file, err := os.Create("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
file.WriteString("Hello, World!")
}

讀寫相關操作

  • os.Open:打開一個檔案進行讀取操作。
  • os.OpenFile:打開一個檔案,可以指定更多的選項,如讀寫模式和權限。
  • os.Getwd:取得當前路徑
  • os.Stat:取得檔案或資料夾訊息。
  • os.IsNotExist:檢查檔案或資料夾是否存在。
  • os.Rename:重命名檔案或資料夾

語法如下:

func os.Open(name string) (*os.File, error)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
func os.Getwd() (dir string, err error)
func os.Stat(name string) (fs.FileInfo, error)
func os.IsNotExist(err error) bool

OpenFile的細項介紹:

第一個參數為檔名,第二個為要對檔案使用的選項,第三個則為檔案權限的設定。

常見的選項有以下幾種:

  • O_RDONLY:以只讀模式打開檔案,不允許寫入。
  • O_WRONLY:以只寫模式打開檔案,不允許讀取。
  • O_APPEND:以附加模式打開檔案,新內容將附加到檔案末尾。
  • O_TRUNC:如果檔案存在,則清空檔案內容。
  • O_EXCL:與 O_CREATE 一起使用時,只有在檔案不存在時才建立檔案,用於防止檔案競爭。
package main

import (
"fmt"
"os"
)

func main() {

// 打開檔案並讀取內容
readFile, err := os.Open("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer readFile.Close()

// 打開一個檔案以進行讀寫操作
file, err := os.OpenFile("example.txt", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()

// 取得當前工作資料夾
wd, err := os.Getwd()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Current Working Directory:", wd)
}

這邊另外介紹一下Stat,

Stat會回傳一個FileInfo的interface

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() any // underlying data source (can return nil)
}
package main

import (
"fmt"
"os"
)

func main() {

fileInfo, err := os.Stat("example.txt")
if err == nil {
fmt.Println("File exists.")
} else if os.IsNotExist(err) {
fmt.Println("File does not exist.")
} else {
fmt.Println("Error:", err)
}

// 取得檔案資訊
fmt.Println(fileInfo.Name())
fmt.Println(fileInfo.IsDir())
fmt.Println(fileInfo.Size())
fmt.Println(fileInfo.ModTime())
fmt.Println(fileInfo.Mode())
}

要寫入檔案則需要先取得os.File物件,可透過Openfile取得。 先來看一下WriteString語法

func (*os.File).WriteString(s string) (n int, err error)

其中s為要寫入的內容,n為寫入的字節數

package main

import (
"fmt"
"os"
)

func main() {

// 打開一個檔案以進行寫入操作
file, err := os.OpenFile("example.txt", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()

// 寫入內容到檔案
_, err = file.WriteString("Hello, Appended Content!")
if err != nil {
fmt.Println("Error writing to file:", err)
return
}

fmt.Println("File opened and written in append mode successfully.")
}

最後介紹一下Rename,語法如下:

func os.Rename(oldpath string, newpath string) error
package main

import (
"fmt"
"os"
)

func main() {

// 重命名檔案
err := os.Rename("oldfile.txt", "newfile.txt")
if err != nil {
fmt.Println("Error:", err)
return
}

// 重命名資料夾
err = os.Rename("olddir", "newdir")
if err != nil {
fmt.Println("Error:", err)
return
}
}

刪除相關操作

  • os.Remove:刪除檔案和資料夾,如果資料夾不為空會報錯。
  • os.RemoveAll:刪除檔案和資料夾。

兩種使用方法都很類似,語法為

func os.Remove(name string) error
func os.RemoveAll(path string) error
package main

import (
"fmt"
"os"
)

func main() {

file, err := os.Create("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()

err := os.Remove("example.txt")
if err != nil {
fmt.Println("Error deleting file:", err)
} else {
fmt.Println("File deleted successfully.")
}

testDir := "d1/d2/d3"
// Create Recursive dir
err := os.MkdirAll(testDir, os.ModePerm)
if err != nil {
fmt.Println("Error creating directory:", err)
}
// 使用 os.RemoveAll() 刪除資料夾
err = os.RemoveAll("d1")
// err = os.Remove("d1") // 因資料夾不為空,因此會噴directory not empty錯誤
if err != nil {
fmt.Println("Error deleting directory:", err)
} else {
fmt.Println("Directory deleted successfully.")
}
}

📚 參考資料

留言
avatar-img
Alan的開發者天地
19會員
83內容數
golang
Alan的開發者天地的其他內容
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
Thumbnail
👨‍💻 簡介 昨天講到 os package,今天繼續補充 os package底下的 exec package,這個package主要用來執行外部指令和處理指令的輸入和輸出,包括如何設定指令、執行指令以及處理輸出等等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
Thumbnail
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News