如何在 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
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 在 Go 語言中,reflect package是用來檢查和操作變數的type、value和struct。常見用法有檢察 type、調用方法,以及修改變數的value。今天簡單介紹 reflect package的主要功能、使用方法和常見用法。
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
👨‍💻簡介 在 Go 語言中,reflect package是用來檢查和操作變數的type、value和struct。常見用法有檢察 type、調用方法,以及修改變數的value。今天簡單介紹 reflect package的主要功能、使用方法和常見用法。
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
👨‍💻簡介 要處理日期和時間,就必須知道這個Package -> time,Go提供了內建的timePackage。 今天主要介紹time的功能,包括時間操作、格式化等等,以及常見用法。
👨‍💻簡介 要印出Hello World,就會碰到這個Package -> fmt,今天來簡單整理一下fmt的作用、格式化的控制與常見用法。
👨‍💻簡介 昨天講到Goroutine的橋梁aka傳話筒 — Channel,那要怎麼知道對方有收到訊息,我的紙條有送到對方手上呢? 今天就是要來介紹幾種Goroutine的確定完成工作的幾種方式。
👨‍💻簡介 昨天講到Goroutine有稍微簡單介紹Channel,Channel是Go語言中極為重要的併發通訊機制,它就像是不同goroutines之間的話筒,允許它們安全地傳遞資料和信息。這個強大的工具使得Go語言在處理併發任務時非常優雅和高效。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
底下為操作流程: 打開「磁碟工具程式」 點選「檔案」 點選「新增映像檔」 點選「來自檔案夾的映像檔」 選擇要製作成「dmg」的物件 選擇要存放「dmg」的資料夾與設定(檔名、加密與映像檔格式)
Thumbnail
MacOS 先下載Homebrew,然後輸入底下指令: brew install go 確認是否安裝完成 go version 環境設定 export GOPATH=$HOME/go
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
※ Git(四) 空的資料夾無法被加入 Git 進行版本控制,但這個資料夾如果又是很重要的資料夾,你會怎麼處理? 當空的目錄無法被加入 Git 進行版本控制時,有以下的做法可以解決: 在那個空目錄裡隨便放一個檔案就行了。 在這個資料夾中添加一個名為 .gitkeep 的空檔案,讓 Git 能
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
底下為操作流程: 打開「磁碟工具程式」 點選「檔案」 點選「新增映像檔」 點選「來自檔案夾的映像檔」 選擇要製作成「dmg」的物件 選擇要存放「dmg」的資料夾與設定(檔名、加密與映像檔格式)
Thumbnail
MacOS 先下載Homebrew,然後輸入底下指令: brew install go 確認是否安裝完成 go version 環境設定 export GOPATH=$HOME/go
※ 需要做版本備份時: git init:初始化此資料夾,由git 開始追蹤版本控制。 git add:將檔案加入到暫存區。 git commit:把暫存區的內容提交到儲存庫。 git status:查看目前所有檔案的狀態。 git log:查看過去所有commit的記錄。 ※ 需要做修
※ Git(四) 空的資料夾無法被加入 Git 進行版本控制,但這個資料夾如果又是很重要的資料夾,你會怎麼處理? 當空的目錄無法被加入 Git 進行版本控制時,有以下的做法可以解決: 在那個空目錄裡隨便放一個檔案就行了。 在這個資料夾中添加一個名為 .gitkeep 的空檔案,讓 Git 能
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42