1. 程式人生 > >Golang檔案操作

Golang檔案操作

在這裡插入圖片描述

一、 檔案的基本介紹

type File
type File struct {
// 內含隱藏或非匯出欄位
}

File代表一個開啟的檔案物件。

1.1 開啟與關閉檔案

1)func Open

func Open(name string) (file *File, err error)

Open開啟一個檔案用於讀取。如果操作成功,返回的檔案物件的方法可用於讀取資料;對應的檔案描述符具有O_RDONLY模式。如果出錯,錯誤底層型別是*PathError。
2)func (*File) Close

func (f *File) Close() error

Close關閉檔案f,使檔案不能用於讀寫。它返回可能出現的錯誤。

1.2 讀取檔案操作

1)帶緩衝區的 Reader

type Reader
type Reader struct {
// 內含隱藏或非匯出欄位
}
Reader實現了給一個io.Reader介面物件附加緩衝。

在這裡插入圖片描述

2)一次性讀取檔案並顯示在終端
使用ioutil包中ReadFile,一次性將檔案讀入到記憶體,這種方式適用於檔案不大的情況。

func ReadFile
func ReadFile(filename string) ([]byte, error)
返回值 []byte 如果要正確顯示,需要轉換成string型別。

ReadFile 從filename指定的檔案中讀取資料並返回檔案的內容。成功的呼叫返回的err為nil而非EOF。因為本函式定義為讀取整個檔案,它不會將讀取返回的EOF視為應報告的錯誤。

1.3 建立檔案

func OpenFile
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

引數name: 檔名
引數flag: 檔案開啟模式

const (
O_RDONLY int = syscall.O_RDONLY // 只讀模式開啟檔案
O_WRONLY int = syscall.O_WRONLY // 只寫模式開啟檔案
O_RDWR int = syscall.O_RDWR // 讀寫模式開啟檔案
O_APPEND int = syscall.O_APPEND // 寫操作時將資料附加到檔案尾部
O_CREATE int = syscall.O_CREAT // 如果不存在將建立一個新檔案
O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,檔案必須不存在
O_SYNC int = syscall.O_SYNC // 開啟檔案用於同步I/O
O_TRUNC int = syscall.O_TRUNC // 如果可能,開啟時清空檔案
)

引數perm: 許可權控制(windows無效)
FileMode代表檔案的模式和許可權位。這些字位在所有的作業系統都有相同的含義,因此檔案的資訊可以在不同的作業系統之間安全的移植。不是所有的位都能用於所有的系統,唯一共有的是用於表示目錄的ModeDir位。

const (
// 單字元是被String方法用於格式化的屬性縮寫。
ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目錄
ModeAppend // a: 只能寫入,且只能寫入到末尾
ModeExclusive // l: 用於執行
ModeTemporary // T: 臨時檔案(非備份檔案)
ModeSymlink // L: 符號連結(不是快捷方式檔案)
ModeDevice // D: 裝置
ModeNamedPipe // p: 命名管道(FIFO)
ModeSocket // S: Unix域socket
ModeSetuid // u: 表示檔案具有其建立者使用者id許可權
ModeSetgid // g: 表示檔案具有其建立者組id的許可權
ModeCharDevice // c: 字元裝置,需已設定ModeDevice
ModeSticky // t: 只有root/建立者能刪除/移動檔案
// 覆蓋所有型別位(用於通過&獲取型別位),對普通檔案,所有這些位都不應被設定
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
ModePerm FileMode = 0777 // 覆蓋所有Unix許可權位(用於通過&獲取型別位)
)

這些被定義的位是FileMode最重要的位。另外9個不重要的位為標準Unix rwxrwxrwx許可權(任何人都可讀、寫、執行)。這些(重要)位的值應被視為公共API的一部分,可能會用於線路協議或硬碟標識:它們不能被修改,但可以新增新的位。
OpenFile是一個更一般性的檔案開啟函式,大多數呼叫者都應用Open或Create代替本函式。它會使用指定的選項(如O_RDONLY等)、指定的模式(如0666等)開啟指定名稱的檔案。如果操作成功,返回的檔案物件可用於I/O。如果出錯,錯誤底層型別是*PathError。

1.4 寫檔案

type Writer
type Writer struct {
// 內含隱藏或非匯出欄位
}
Writer實現了為io.Writer介面物件提供緩衝。如果在向一個Writer型別值寫入時遇到了錯誤,該物件將不再接受任何資料,且所有寫操作都會返回該錯誤。在說有資料都寫入後,呼叫者有義務呼叫Flush方法以保證所有的資料都交給了下層的io.Writer。

在這裡插入圖片描述

1.5 判斷檔案或資料夾是否存在

func Stat
func Stat(name string) (fi FileInfo, err error)
Stat返回一個描述name指定的檔案物件的FileInfo。如果指定的檔案物件是一個符號連結,返回的FileInfo描述該符號連結指向的檔案的資訊,本函式會嘗試跳轉該連結。如果出錯,返回的錯誤值為*PathError型別。

注意:
1)返回的錯誤為nil,說明檔案或資料夾存在
2)返回的錯誤若是os.IsNotExist(err)為真,說明檔案或資料夾不存在
3)返回的錯誤是其他型別,則不確定是否存在
在這裡插入圖片描述

1.6 檔案拷貝

func Copy
func Copy(dst Writer, src Reader) (written int64, err error)
將src的資料拷貝到dst,直到在src上到達EOF或發生錯誤。返回拷貝的位元組數和遇到的第一個錯誤。

對成功的呼叫,返回值err為nil而非EOF,因為Copy定義為從src讀取直到EOF,它不會將讀取到EOF視為應報告的錯誤。如果src實現了WriterTo介面,本函式會呼叫src.WriteTo(dst)進行拷貝;否則如果dst實現了ReaderFrom介面,本函式會呼叫dst.ReadFrom(src)進行拷貝。
在這裡插入圖片描述

二、 io包

1. type Writer

type Writer struct {
// 內含隱藏或非匯出欄位
}
Writer實現了為io.Writer介面物件提供緩衝。如果在向一個Writer型別值寫入時遇到了錯誤,該物件將不再接受任何資料,且所有寫操作都會返回該錯誤。在說有資料都寫入後,呼叫者有義務呼叫Flush方法以保證所有的資料都交給了下層的io.Writer。

1.1 func NewWriter

func NewWriter(w io.Writer) Writer
NewWriter建立一個具有預設大小緩衝、寫入w的
Writer。

1.2 func NewWriterSize

func NewWriterSize(w io.Writer, size int) Writer
NewWriterSize建立一個具有最少有size尺寸的緩衝、寫入w的
Writer。如果引數w已經是一個具有足夠大緩衝的*Writer型別值,會返回w。

1.3 func (*Writer) Reset

func (b *Writer) Reset(w io.Writer)
Reset丟棄緩衝中的資料,清除任何錯誤,將b重設為將其輸出寫入w。

1.4 func (*Writer) Buffered

func (b *Writer) Buffered() int
Buffered返回緩衝中已使用的位元組數。

1.5 func (*Writer) Available

func (b *Writer) Available() int
Available返回緩衝中還有多少位元組未使用。

1.1 func (*Writer) Write

func (b *Writer) Write(p []byte) (nn int, err error)
Write將p的內容寫入緩衝。返回寫入的位元組數。如果返回值nn < len§,還會返回一個錯誤說明原因。

1.6 func (*Writer) WriteString

func (b *Writer) WriteString(s string) (int, error)
WriteString寫入一個字串。返回寫入的位元組數。如果返回值nn < len(s),還會返回一個錯誤說明原因。

1.7 func (*Writer) WriteByte

func (b *Writer) WriteByte(c byte) error
WriteByte寫入單個位元組。

1.8 func (*Writer) WriteRune

func (b *Writer) WriteRune(r rune) (size int, err error)
WriteRune寫入一個unicode碼值(的utf-8編碼),返回寫入的位元組數和可能的錯誤。

1.9 func (*Writer) Flush

func (b *Writer) Flush() error
Flush方法將緩衝中的資料寫入下層的io.Writer介面。

1.10 func (*Writer) ReadFrom

func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)
ReadFrom實現了io.ReaderFrom介面。

2. type Reader

type Reader struct {
// 內含隱藏或非匯出欄位
}
Reader實現了給一個io.Reader介面物件附加緩衝。

2.1 func NewReader

func NewReader(rd io.Reader) Reader
NewReader建立一個具有預設大小緩衝、從r讀取的
Reader。

2.2 func NewReaderSize

func NewReaderSize(rd io.Reader, size int) Reader
NewReaderSize建立一個具有最少有size尺寸的緩衝、從r讀取的
Reader。如果引數r已經是一個具有足夠大緩衝的* Reader型別值,會返回r。

2.3 func (*Reader) Reset

func (b *Reader) Reset(r io.Reader)
Reset丟棄緩衝中的資料,清除任何錯誤,將b重設為其下層從r讀取資料。

2.4 func (*Reader) Buffered

func (b *Reader) Buffered() int
Buffered返回緩衝中現有的可讀取的位元組數。

2.5 func (*Reader) Peek

func (b *Reader) Peek(n int) ([]byte, error)
Peek返回輸入流的下n個位元組,而不會移動讀取位置。返回的[]byte只在下一次呼叫讀取操作前合法。如果Peek返回的切片長度比n小,它也會返會一個錯誤說明原因。如果n比緩衝尺寸還大,返回的錯誤將是ErrBufferFull。

2.6 func (*Reader) Read

func (b *Reader) Read(p []byte) (n int, err error)
Read讀取資料寫入p。本方法返回寫入p的位元組數。本方法一次呼叫最多會呼叫下層Reader介面一次Read方法,因此返回值n可能小於len§。讀取到達結尾時,返回值n將為0而err將為io.EOF。

2.7 func (*Reader) ReadByte

func (b *Reader) ReadByte() (c byte, err error)
ReadByte讀取並返回一個位元組。如果沒有可用的資料,會返回錯誤。

2.8 func (*Reader) UnreadByte

func (b *Reader) UnreadByte() error
UnreadByte吐出最近一次讀取操作讀取的最後一個位元組。(只能吐出最後一個,多次呼叫會出問題)

2.9 func (*Reader) ReadRune

func (b *Reader) ReadRune() (r rune, size int, err error)
ReadRune讀取一個utf-8編碼的unicode碼值,返回該碼值、其編碼長度和可能的錯誤。如果utf-8編碼非法,讀取位置只移動1位元組,返回U+FFFD,返回值size為1而err為nil。如果沒有可用的資料,會返回錯誤。

2.10 func (*Reader) UnreadRune

func (b *Reader) UnreadRune() error
UnreadRune讀取最近一次ReadRune呼叫讀取的unicode碼值。如果最近一次讀取不是呼叫的ReadRune,會返回錯誤。(從這點看,UnreadRune比UnreadByte嚴格很多)

2.11 func (*Reader) ReadLine

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
ReadLine是一個低水平的行資料讀取原語。大多數呼叫者應使用ReadBytes(’\n’)或ReadString(’\n’)代替,或者使用Scanner。

ReadLine嘗試返回一行資料,不包括行尾標誌的位元組。如果行太長超過了緩衝,返回值isPrefix會被設為true,並返回行的前面一部分。該行剩下的部分將在之後的呼叫中返回。返回值isPrefix會在返回該行最後一個片段時才設為false。返回切片是緩衝的子切片,只在下一次讀取操作之前有效。ReadLine要麼返回一個非nil的line,要麼返回一個非nil的err,兩個返回值至少一個非nil。

返回的文字不包含行尾的標誌位元組("\r\n"或"\n")。如果輸入流結束時沒有行尾標誌位元組,方法不會出錯,也不會指出這一情況。在呼叫ReadLine之後呼叫UnreadByte會總是吐出最後一個讀取的位元組(很可能是該行的行尾標誌位元組),即使該位元組不是ReadLine返回值的一部分。

2.12 func (*Reader) ReadSlice

func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
ReadSlice讀取直到第一次遇到delim位元組,返回緩衝裡的包含已讀取的資料和delim位元組的切片。該返回值只在下一次讀取操作之前合法。如果ReadSlice放在在讀取到delim之前遇到了錯誤,它會返回在錯誤之前讀取的資料在緩衝中的切片以及該錯誤(一般是io.EOF)。如果在讀取到delim之前緩衝就被寫滿了,ReadSlice失敗並返回ErrBufferFull。因為ReadSlice的返回值會被下一次I/O操作重寫,呼叫者應儘量使用ReadBytes或ReadString替代本法功法。當且僅當ReadBytes方法返回的切片不以delim結尾時,會返回一個非nil的錯誤。

2.13 func (*Reader) ReadBytes

func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
ReadBytes讀取直到第一次遇到delim位元組,返回一個包含已讀取的資料和delim位元組的切片。如果ReadBytes方法在讀取到delim之前遇到了錯誤,它會返回在錯誤之前讀取的資料以及該錯誤(一般是io.EOF)。當且僅當ReadBytes方法返回的切片不以delim結尾時,會返回一個非nil的錯誤。

2.14 func (*Reader) ReadString

func (b *Reader) ReadString(delim byte) (line string, err error)
ReadString讀取直到第一次遇到delim位元組,返回一個包含已讀取的資料和delim位元組的字串。如果ReadString方法在讀取到delim之前遇到了錯誤,它會返回在錯誤之前讀取的資料以及該錯誤(一般是io.EOF)。當且僅當ReadString方法返回的切片不以delim結尾時,會返回一個非nil的錯誤。

2.15 func (*Reader) WriteTo

func (b *Reader) WriteTo(w io.Writer) (n int64, err error)
WriteTo方法實現了io.WriterTo介面。

三、 ioutil包

3.1 func ReadAll

func ReadAll(r io.Reader) ([]byte, error)
ReadAll從r讀取資料直到EOF或遇到error,返回讀取的資料和遇到的錯誤。成功的呼叫返回的err為nil而非EOF。因為本函式定義為讀取r直到EOF,它不會將讀取返回的EOF視為應報告的錯誤。

3.2 func ReadFile

func ReadFile(filename string) ([]byte, error)
ReadFile 從filename指定的檔案中讀取資料並返回檔案的內容。成功的呼叫返回的err為nil而非EOF。因為本函式定義為讀取整個檔案,它不會將讀取返回的EOF視為應報告的錯誤。

3.3 func WriteFile

func WriteFile(filename string, data []byte, perm os.FileMode) error
函式向filename指定的檔案中寫入資料。如果檔案不存在將按給出的許可權建立檔案,否則在寫入資料之前清空檔案。

3.4 func ReadDir

func ReadDir(dirname string) ([]os.FileInfo, error)
返回dirname指定的目錄的目錄資訊的有序列表。