一、文件
Golang中,文件是指計算機中存儲數(shù)據(jù)的實體,文件可以是文本文件、二進制文件、配置文件等。在Go語言中,通過操作文件,我們可以讀取文件的內(nèi)容,寫入數(shù)據(jù)到文件,以及獲取文件的屬性等。
Golang中的文件可以分為兩種類型:文本文件和二進制文件。文本文件是指只包含文本內(nèi)容的文件,可以用文本編輯器打開進行查看和編輯。而二進制文件是指除文本內(nèi)容外還包含其他數(shù)據(jù)的文件,如圖片、音頻、視頻等文件。
在Golang中,文件是以文件流的形式進行操作的,文件流是指將文件中的內(nèi)容作為一個流來處理的方式,通過讀取流來獲取文件的內(nèi)容,通過寫入流來向文件中寫入數(shù)據(jù)。
二、文件目錄
在Golang中,文件目錄是指計算機文件系統(tǒng)中的文件夾或目錄。目錄是用于組織和存儲文件的一種方式,可以包含文件和其他子目錄。
Golang中的文件目錄操作基本概念主要涉及文件和目錄的創(chuàng)建、打開、讀取、寫入、刪除等操作。
-
文件路徑:文件路徑是用于定位文件或目錄的字符串。在Go語言中,可以使用絕對路徑或相對路徑來表示文件路徑。絕對路徑是從根目錄開始的完整路徑,而相對路徑是相對于當前工作目錄的路徑。
-
文件操作:在Go語言中,可以使用os包進行文件操作。常用的文件操作包括創(chuàng)建文件、打開文件、讀取文件內(nèi)容、寫入文件內(nèi)容和關閉文件等。
-
目錄操作:同樣在os包中,可以進行目錄操作,如創(chuàng)建目錄、刪除目錄、遍歷目錄等。常用的目錄操作函數(shù)包括Mkdir、MkdirAll、Remove、RemoveAll和ReadDir等。
-
文件信息:通過os包中的函數(shù),可以獲取文件的相關信息,如文件大小、修改時間、權限等。常用的文件信息函數(shù)包括Stat和FileInfo等。
-
文件讀寫:Go語言中的文件讀寫操作可以使用os包中的Open函數(shù)打開文件,然后使用Read和Write方法來讀取和寫入文件內(nèi)容。還可以使用bufio包提供的緩沖讀寫方式來提高讀寫效率。
-
錯誤處理:在文件和目錄操作過程中,可能會出現(xiàn)各種錯誤,如文件不存在、權限不足等。在Go語言中,通過錯誤返回值來處理這些錯誤,常用的處理方式包括檢查錯誤值、使用defer語句關閉文件和使用log包輸出錯誤信息等。
-
文件刪除:在Go語言中,可以使用os包中的Remove函數(shù)刪除文件。需要注意的是,刪除文件是一個不可逆操作,謹慎使用。
總而言之,Go語言提供了豐富的文件和目錄操作函數(shù),可以方便地進行文件和目錄的創(chuàng)建、打開、讀寫和刪除等操作。開發(fā)者可以根據(jù)具體需求使用這些函數(shù)來處理文件和目錄操作。
三、文件目錄操作
3.1、讀取文件
3.1.1、方法一 (file.Read())
- 只讀方式打開文件 file,err := os.Open()
- 讀取文件 file.Read()
- 關閉文件流 defer file Close()
package main
import (
"fmt"
"io"
"os"
)
func main() {
//只讀方式打開當前目錄下的main.go文件
file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
defer file.Close() //必須關閉文件流
if err != nil {
fmt.Println(err)
return
}
//操作文件
fmt.Println(file) //&{0xc000100780}
//讀取文件里面的內(nèi)容
var strSlice []byte
var tempSlice = make([]byte, 20)
for {
n, err := file.Read(tempSlice)
if err == io.EOF { //err == io.EOF表示讀取完畢
fmt.Println("讀取完畢")
break
}
if err != nil {
fmt.Println("讀取失敗")
return
}
strSlice = append(strSlice, tempSlice[:n]...) //注意寫法
}
fmt.Println(string(strSlice)) //強制類型轉換
}
成功讀取到了文件的地址
3.1.2、方法二 (bufio讀取文件)
-
只讀方式打開文件 file,err := os.Open()
-
創(chuàng)建reader對象 reader := bufio.NewReader(file)
-
ReadString讀取文件 line,err := reader.ReadString(‘\n’)
-
關閉文件流 defer file.Close()
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("D:/GoLang/go_demo/helloworld/hello.go")
defer file.Close() //必須關閉文件流
if err != nil {
fmt.Println(err)
return
}
//bufio讀取文件
var fileStr string
reader := bufio.NewReader(file)
for {
line, err := reader.ReadString('\n') //表示一次讀取一行
if err == io.EOF {
fileStr += line
break
}
if err != nil {
fmt.Println(err)
return
}
fileStr += line
}
fmt.Println(fileStr)
}
3.1.3、方法三 (ioutil 讀取方法)
打開關閉文件的方法它都封裝好了,只需要一句話就可以讀取
ioutil.ReadFile(“D:/GoLang/go_demo/helloworld/hello.go”)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
byteStr, err := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(byteStr))
}
3.2、寫入文件
寫入文件需要用到os.OpenFile(),其源碼為:
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
testlog.Open(name)
f, err := openFileNolog(name, flag, perm)
if err != nil {
return nil, err
}
f.appendMode = flag&O_APPEND != 0
return f, nil
}
name 要打開的文件名,flag 打開文件的格式,perm 文件權限,一個八進制數(shù) r(讀)04 w(寫)02 x(執(zhí)行)01
其中flag分為:
os.O_WRONLY 只寫
os.O_CREATE 創(chuàng)建文件
os.O_RDONLY 只讀
os.O_RDWR 讀寫
os.O_TRUNC 清空
os.O_APPEND 追加
3.2.1、方法一
-
打開文件 file, err := os.OpenFile(“D:/GoLang/go_demo/helloworld/hello.go”, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
-
寫入文件
file.Write([]byte(str)) //寫入字節(jié)切片數(shù)據(jù)
file.WriteString(“直接寫入的字符串數(shù)據(jù)”) //直接寫入的字符串數(shù)據(jù)
- 關閉文件流 file.Close()
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
defer file.Close()
if err != nil {
fmt.Println(err)
return
}
file.WriteString("http://直接寫入的字符串數(shù)據(jù)")
}
hello.go中就會被按要求追加
3.2.2、方法二
- 打開文件 file, err := os.OpenFile(“D:/GoLang/go_demo/helloworld/hello.go”, os.O_CREATE|os.O_APPEND, 0666)
2 .創(chuàng)建writer對象 writer := bufio.NewWriter(file)
-
將數(shù)據(jù)寫入緩存 writer.WriteString(“你好Golang\n”)
-
將緩存中的內(nèi)容寫入文件 writer.Flush()
-
關閉文件流 file.Close()
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
file, err := os.OpenFile("D:/GoLang/go_demo/helloworld/hello.go", os.O_CREATE|os.O_APPEND, 0666)
defer file.Close()
if err != nil {
fmt.Println(err)
return
}
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString("http://你好Golang" + strconv.Itoa(i) + "\n")
}
writer.Flush()
}
按要求追加數(shù)據(jù)
3.2.3、方法三 (ioutil寫入文件)
str := “hello Golang”
err := ioutil.WriteFile(“D:/GoLang/go_demo/helloworld/hello.go”, []byte(str), 0666)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
str := "http://hello golang"
err := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/hello.go", []byte(str), 0666)
if err != nil {
fmt.Println(err)
return
}
}
3.3、復制文件
3.3.1、方法一
byteStr, err1 := ioutil.ReadFile(“D:/GoLang/go_demo/helloworld/hello.go”)
err2 := ioutil.WriteFile(“D:/GoLang/go_demo/helloworld/world.go”, byteStr, 0666)
package main
import (
"fmt"
"io/ioutil"
)
func main() {
byteStr, err1 := ioutil.ReadFile("D:/GoLang/go_demo/helloworld/hello.go")
if err1 != nil {
fmt.Println(err1)
return
}
err2 := ioutil.WriteFile("D:/GoLang/go_demo/helloworld/world.go", byteStr, 0666)
if err2 != nil {
fmt.Println(err2)
return
}
fmt.Println("復制文件成功 ")
}
成功復制hello.go中的內(nèi)容
3.3.2、方法二
source, _ := os.Open(srcFileName)
destination, _ := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)
n, err := source.Read(buf)
destination.Write(buf[:n]);
package main
import (
"fmt"
"io"
"os"
)
// 編寫一個函數(shù),接受兩個文件路徑 srcFileName 和 dstFileName
func CopyFile(srcFileName string, dstFileName string) (err error) {
sFile, err1 := os.Open(srcFileName)
defer sFile.Close()
dFile, err2 := os.OpenFile(dstFileName, os.O_CREATE|os.O_WRONLY, 0666)
defer dFile.Close()
if err1 != nil {
return err1
}
if err2 != nil {
return err2
}
var tempSlice = make([]byte, 50)
for {
//讀取數(shù)據(jù)
n, err := sFile.Read(tempSlice)
if err == io.EOF {
break
}
if err != nil {
return err
}
//寫入數(shù)據(jù)
if _, err := dFile.Write(tempSlice[:n]); err != nil {
return err
}
}
return nil
}
func main() {
srcFile := "D:/GoLang/go_demo/helloworld/hello.go"
dstFile := "D:/GoLang/go_demo/helloworld/world.go"
err := CopyFile(srcFile, dstFile)
if err == nil {
fmt.Println("拷貝完成")
} else {
fmt.Printf("拷貝錯誤 err = %v", err)
}
}
成功拷貝文章來源:http://www.zghlxwxcb.cn/news/detail-613568.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-613568.html
到了這里,關于【Golang】Golang進階系列教程--Golang中文件目錄操作的實現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!