如何在 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
留言分享你的想法!
avatar-img
Alan的開發者天地
18會員
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
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
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就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
👨‍💻簡介 在這篇文章裡,會簡單介紹幾個關鍵的基本概念和語法結構,加快上手這門程式語言。
Thumbnail
👨‍💻簡介 在這篇文章裡,會簡單介紹幾個關鍵的基本概念和語法結構,加快上手這門程式語言。
Thumbnail
進入目錄、列出目錄列表、讀取檔案內容、寫入檔案(資料)、變更檔案名稱、刪除檔案、目錄內新增檔案、變更目錄名稱、刪除目錄
Thumbnail
進入目錄、列出目錄列表、讀取檔案內容、寫入檔案(資料)、變更檔案名稱、刪除檔案、目錄內新增檔案、變更目錄名稱、刪除目錄
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News