如何在 Go 中操作檔案

更新於 2024/09/19閱讀時間約 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
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章介紹如何在Fedora系統上使用Wine安裝Line應用程式。Wine使Linux用戶能夠執行Windows應用,因此本文將詳細說明從下載Line、安裝到運行的整個過程。文章也會提到運行Line時可能遇到的一些功能問題,幫助用戶更好地理解如何在Linux環境中使用這款熱門的傳訊軟體。
Thumbnail
皮膚狀態疲倦衰老,膚質越來越差怎麼辦?化妝遮瑕都快要遮不住,感覺肌膚負擔越來越大,到底該如何改善?2024年EGF(表皮生長因子)的最新發展,到現在可以改善皮膚狀態還有哪些優勢?好處?要明白,EGF熱門一段時間,至今仍是市場上的熱門抗老成分。 其實EG
數碼營銷(Digital Marketing)是當今商業世界中不可或缺的一環。在這個數位時代,企業需要利用各種數碼工具和平台來推廣其產品或服務,以吸引更多的客戶並提升業績。其中,網頁設計、網頁寄存以及關鍵字廣告是數碼營銷中極為重要的元素。 網頁設計在數碼營銷中扮演著關鍵的角色。一個具有吸引力和易用
Thumbnail
這幾年從韓國開始流行用 Notion 做各種管理,也有不少人靠賣 Notion 模板賺錢,但是要怎麼賣呢? 除了可以在自己的 blog 或者 YT 上面賣,還有一個很常被用來賣模板的平台是 Gumroad。
Thumbnail
本文章探討了在親密關係中給予建議時如何有效緩解焦慮的技巧。過於直白的建議可能會加重對方的焦慮感,因為他們渴望的是理解和情感上的支持,而非僅僅是解決方案。文中介紹了一個叫做「先跟後帶」的方法,強調在提出建議之前,應先認同對方的感受,進而建立信任,提升建議被接納的機會。
Thumbnail
本篇內容如下 1. 如何判斷一檔有價值的股票 2. 如何挑選一檔可以長期投資的股票 3. 中長線價值投資者,需具備的能力 如何判斷一檔有價值的股票,在挑選股票前,需判斷的幾個指標 1. 公司獲利是否穩定,只有穩定獲利的公司,才有辦法持續每一年將獲利投入公司淨值與配發股票股利給股東,切記公司需要是長
Thumbnail
有多種情況下我們需要從API取消請求: 如果我們正在建立一個支付系統,並且請求一直進行,但使用者希望立即取消這筆訂單。這就是為什麼開發者會建立這個功能的原因。 從電子商務購買商品。使用者意外關閉了頁面,無法立即返回上一頁。 訂閱取消。 ......等等 這將對對這個系統沒有信心的使用者產生影響。因
Thumbnail
你熟悉英文電話接聽常見的句型嗎?你熟悉英文電話留言常用的句子嗎?試試這篇進階版的電話英文,練習成功轉移話題的技巧吧。 如何在英文電話中成功轉移話題 工作忙到一半,突然有個老外打電話來,如果開場白也講完了,對方開始講一些不是重點的對話,感覺想要閒聊一下而你卻沒有這樣的美國時間,這時你可以用下面的例句
在方案總管視窗上有”顯示所有檔案” icon click 會出現所有檔案樹狀圖,在要加入的檔案icon上按右鍵, 會出現menu, 選按”加入至專案”即可。
Thumbnail
留白是網站設計中被廣泛應用的手法。我們常常認為安靜、空的、無色的東西是無聊的,卻鮮少人了解到正因為這些空白的存在,才會成為有聲、有物、有色的對比基礎。網站設計中,很多人認為任何留白都是浪費空間,應該要讓大家看到越多內容越好。但事實上,留白是非常強大的視覺設計技巧,適當的留白甚至與好的內容同等重要。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章介紹如何在Fedora系統上使用Wine安裝Line應用程式。Wine使Linux用戶能夠執行Windows應用,因此本文將詳細說明從下載Line、安裝到運行的整個過程。文章也會提到運行Line時可能遇到的一些功能問題,幫助用戶更好地理解如何在Linux環境中使用這款熱門的傳訊軟體。
Thumbnail
皮膚狀態疲倦衰老,膚質越來越差怎麼辦?化妝遮瑕都快要遮不住,感覺肌膚負擔越來越大,到底該如何改善?2024年EGF(表皮生長因子)的最新發展,到現在可以改善皮膚狀態還有哪些優勢?好處?要明白,EGF熱門一段時間,至今仍是市場上的熱門抗老成分。 其實EG
數碼營銷(Digital Marketing)是當今商業世界中不可或缺的一環。在這個數位時代,企業需要利用各種數碼工具和平台來推廣其產品或服務,以吸引更多的客戶並提升業績。其中,網頁設計、網頁寄存以及關鍵字廣告是數碼營銷中極為重要的元素。 網頁設計在數碼營銷中扮演著關鍵的角色。一個具有吸引力和易用
Thumbnail
這幾年從韓國開始流行用 Notion 做各種管理,也有不少人靠賣 Notion 模板賺錢,但是要怎麼賣呢? 除了可以在自己的 blog 或者 YT 上面賣,還有一個很常被用來賣模板的平台是 Gumroad。
Thumbnail
本文章探討了在親密關係中給予建議時如何有效緩解焦慮的技巧。過於直白的建議可能會加重對方的焦慮感,因為他們渴望的是理解和情感上的支持,而非僅僅是解決方案。文中介紹了一個叫做「先跟後帶」的方法,強調在提出建議之前,應先認同對方的感受,進而建立信任,提升建議被接納的機會。
Thumbnail
本篇內容如下 1. 如何判斷一檔有價值的股票 2. 如何挑選一檔可以長期投資的股票 3. 中長線價值投資者,需具備的能力 如何判斷一檔有價值的股票,在挑選股票前,需判斷的幾個指標 1. 公司獲利是否穩定,只有穩定獲利的公司,才有辦法持續每一年將獲利投入公司淨值與配發股票股利給股東,切記公司需要是長
Thumbnail
有多種情況下我們需要從API取消請求: 如果我們正在建立一個支付系統,並且請求一直進行,但使用者希望立即取消這筆訂單。這就是為什麼開發者會建立這個功能的原因。 從電子商務購買商品。使用者意外關閉了頁面,無法立即返回上一頁。 訂閱取消。 ......等等 這將對對這個系統沒有信心的使用者產生影響。因
Thumbnail
你熟悉英文電話接聽常見的句型嗎?你熟悉英文電話留言常用的句子嗎?試試這篇進階版的電話英文,練習成功轉移話題的技巧吧。 如何在英文電話中成功轉移話題 工作忙到一半,突然有個老外打電話來,如果開場白也講完了,對方開始講一些不是重點的對話,感覺想要閒聊一下而你卻沒有這樣的美國時間,這時你可以用下面的例句
在方案總管視窗上有”顯示所有檔案” icon click 會出現所有檔案樹狀圖,在要加入的檔案icon上按右鍵, 會出現menu, 選按”加入至專案”即可。
Thumbnail
留白是網站設計中被廣泛應用的手法。我們常常認為安靜、空的、無色的東西是無聊的,卻鮮少人了解到正因為這些空白的存在,才會成為有聲、有物、有色的對比基礎。網站設計中,很多人認為任何留白都是浪費空間,應該要讓大家看到越多內容越好。但事實上,留白是非常強大的視覺設計技巧,適當的留白甚至與好的內容同等重要。