Go語言學習筆記(五)文件操作

来源:http://www.cnblogs.com/suoning/archive/2017/07/28/7225096.html
-Advertisement-
Play Games

加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 文件讀取 os.File 封裝了文件相關操作 type File File代表一個打開的文件對象。 func Create(name string) (file *File, err error) Create採用 ...


加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959

文件讀取

os.File 封裝了文件相關操作

type File
File代表一個打開的文件對象。

func Create(name string) (file *File, err error)
Create採用模式0666(任何人都可讀寫,不可執行)創建一個名為name的文件,如果文件已存在會截斷它(為空文件)。如果成功,返回的文件對象可用於I/O;對應的文件描述符具有O_RDWR模式。如果出錯,錯誤底層類型是*PathError。

func Open(name string) (file *File, err error)
Open打開一個文件用於讀取。如果操作成功,返回的文件對象的方法可用於讀取數據;對應的文件描述符具有O_RDONLY模式。如果出錯,錯誤底層類型是*PathError。

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一個更一般性的文件打開函數,大多數調用者都應用Open或Create代替本函數。它會使用指定的選項(如O_RDONLY等)、指定的模式(如0666等)打開指定名稱的文件。如果操作成功,返回的文件對象可用於I/O。如果出錯,錯誤底層類型是*PathError。

func NewFile(fd uintptr, name string) *File
NewFile使用給出的Unix文件描述符和名稱創建一個文件。

func Pipe() (r *File, w *File, err error)
Pipe返回一對關聯的文件對象。從r的讀取將返回寫入w的數據。本函數會返回兩個文件對象和可能的錯誤。

func (f *File) Name() string
Name方法返回(提供給Open/Create等方法的)文件名稱。

func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo類型值。如果出錯,錯誤底層類型是*PathError。

func (f *File) Fd() uintptr
Fd返回與文件f對應的整數類型的Unix文件描述符。

func (f *File) Chdir() error
Chdir將當前工作目錄修改為f,f必須是一個目錄。如果出錯,錯誤底層類型是*PathError。

func (f *File) Chmod(mode FileMode) error
Chmod修改文件的模式。如果出錯,錯誤底層類型是*PathError。

func (f *File) Chown(uid, gid int) error
Chown修改文件的用戶ID和組ID。如果出錯,錯誤底層類型是*PathError。

func (f *File) Readdir(n int) (fi []FileInfo, err error)
Readdir讀取目錄f的內容,返回一個有n個成員的[]FileInfo,這些FileInfo是被Lstat返回的,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。
如果n>0,Readdir函數會返回一個最多n個成員的切片。這時,如果Readdir返回一個空切片,它會返回一個非nil的錯誤說明原因。如果到達了目錄f的結尾,返回值err會是io.EOF。
如果n<=0,Readdir函數返回目錄中剩餘所有文件對象的FileInfo構成的切片。此時,如果Readdir調用成功(讀取所有內容直到結尾),它會返回該切片和nil的錯誤值。如果在到達結尾前遇到錯誤,會返回之前成功讀取的FileInfo構成的切片和該錯誤。

func (f *File) Readdirnames(n int) (names []string, err error)
Readdir讀取目錄f的內容,返回一個有n個成員的[]string,切片成員為目錄中文件對象的名字,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。
如果n>0,Readdir函數會返回一個最多n個成員的切片。這時,如果Readdir返回一個空切片,它會返回一個非nil的錯誤說明原因。如果到達了目錄f的結尾,返回值err會是io.EOF。
如果n<=0,Readdir函數返回目錄中剩餘所有文件對象的名字構成的切片。此時,如果Readdir調用成功(讀取所有內容直到結尾),它會返回該切片和nil的錯誤值。如果在到達結尾前遇到錯誤,會返回之前成功讀取的名字構成的切片和該錯誤。

func (f *File) Truncate(size int64) error
Truncate改變文件的大小,它不會改變I/O的當前位置。 如果截斷文件,多出的部分就會被丟棄。如果出錯,錯誤底層類型是*PathError。

func (f *File) Read(b []byte) (n int, err error)
Read方法從f中讀取最多len(b)位元組數據並寫入b。它返回讀取的位元組數和可能遇到的任何錯誤。文件終止標誌是讀取0個位元組且返回值err為io.EOF。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt從指定的位置(相對於文件開始位置)讀取len(b)位元組數據並寫入b。它返回讀取的位元組數和可能遇到的任何錯誤。當n<len(b)時,本方法總是會返回錯誤;如果是因為到達文件結尾,返回值err會是io.EOF。

func (f *File) Write(b []byte) (n int, err error)
Write向文件中寫入len(b)位元組數據。它返回寫入的位元組數和可能遇到的任何錯誤。如果返回值n!=len(b),本方法會返回一個非nil的錯誤。

func (f *File) WriteString(s string) (ret int, err error)
WriteString類似Write,但接受一個字元串參數。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相對於文件開始位置)寫入len(b)位元組數據。它返回寫入的位元組數和可能遇到的任何錯誤。如果返回值n!=len(b),本方法會返回一個非nil的錯誤。

func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek設置下一次讀/寫的位置。offset為相對偏移量,而whence決定相對位置:0為相對文件開頭,1為相對當前位置,2為相對文件結尾。它返回新的偏移量(相對開頭)和可能的錯誤。

func (f *File) Sync() (err error)
Sync遞交文件的當前內容進行穩定的存儲。一般來說,這表示將文件系統的最近寫入的數據在記憶體中的拷貝刷新到硬碟中穩定保存。

func (f *File) Close() error
Close關閉文件f,使文件不能用於讀寫。它返回可能出現的錯誤。
os.File Pkg Doc

 

讀寫參數

文件打開模式:

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  // 如果可能,打開時清空文件
)

許可權控制:

r ——> 004
w ——> 002
x ——> 001

 

讀取慄子

os.Open || os.OpenFile
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    // file, err := os.Open("/tmp/test")
    file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        fmt.Println("Open file error: ", err)
        return
    }
    defer file.Close()    //關閉文件

    reader := bufio.NewReader(file)    //帶緩衝區的讀寫
    for {
        str, err := reader.ReadString('\n')    // 迴圈讀取一行
        if err != nil {
            fmt.Println("read string failed, err: ", err)
            return
        }
        fmt.Println("read string is %s: ", str)
    }
}

 

readline

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    file, err := os.Open("C:/test.log")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    var line []byte
    for {
        data, prefix, err := reader.ReadLine()
        if err == io.EOF {
            break
        }

        line = append(line, data...)
        if !prefix {
            fmt.Printf("data:%s\n", string(line))
            line = line[:]
        }

    }
}

 

讀取整個文件慄子

"io/ioutil" 包實現了讀取整個文件功能

package main

import (
    "fmt"
    "os"
    "io/ioutil"
)

func main() {
    fileName := "/tmp/test"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666)
    if err != nil {
        fmt.Println("Open file error: ", err)
        return
    }
    defer file.Close()

    buf, err := ioutil.ReadAll(file)
    //buf, err := ioutil.ReadFile(fileName)
    if err != nil {
        fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
        return
    }
    fmt.Printf("%s\n", string(buf))
}

 

讀取壓縮文件慄子

"compress/*" 包實現壓縮文件功能。

"compress/gzip" 包實現了gzip格式壓縮文件的讀寫 

package main

import (
    "bufio"
    "compress/gzip"
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test.log.gz"

    var r *bufio.Reader

    fi, err := os.Open(fileName)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }

    fz, err := gzip.NewReader(fi)
    if err != nil {
        fmt.Println("error", err)
        return
    }

    r = bufio.NewReader(fz)
    for {
        line, err := r.ReadString('\n')
        if err != nil {
            fmt.Println("Done reading file")
            return
        }
        fmt.Println(line)
    }
}

 

文件寫入

file.WriteString || file.Write

package main

import (
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test_write"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }
    defer file.Close()

    fileString := "Today very happy."
    file.Seek(0, 2)    // 最後增加
    file.WriteString(fileString)
    //file.Write([]byte(fileString))
}

 

bufio.Writer.WriteString

帶緩衝的寫,最後要將緩衝中的數據寫入下層的io.Writer介面(Flush方法)

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    fileName := "/tmp/test_write"

    file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755)
    if err != nil {
        fmt.Println("error", err)
        os.Exit(1)
    }
    defer file.Close()

    fileWrite := bufio.NewWriter(file)
    fileString := "good.\n"
    for i := 0; i < 10; i++ {
        fileWrite.WriteString(fileString)
    }
    fileWrite.Flush()
}

 

拷貝文件慄子

從一個文件拷貝到另一個文件

package main

import (
    "fmt"
    "io"
    "os"
)

func CopyFile(dstName, srcName string) (writeen int64, err error) {
    src, err := os.Open(dstName)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer src.Close()

    dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}

func main() {
    CopyFile("/tmp/test", "/tmp/test_copy1")
    fmt.Println("copy done.")
}

 

慄子

判斷文件或文件夾是否存在

func PathExists(path string) (bool, error) {
    /*
    判斷文件或文件夾是否存在
    如果返回的錯誤為nil,說明文件或文件夾存在
    如果返回的錯誤類型使用os.IsNotExist()判斷為true,說明文件或文件夾不存在
    如果返回的錯誤為其它類型,則不確定是否在存在
    */
    _, err := os.Stat(path)
    if err == nil {
        return true, nil
    }
    if os.IsNotExist(err) {
        return false, nil
    }
    return false, err
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先我介紹一下為什麼我需要用到ajax技術 1.頁面上有個text類型的輸入框,當我點擊提交的時候,可以把文本框中的值傳遞到後臺去 2.後臺接收傳遞的參數 3.連接資料庫,把傳遞來的內容添加到資料庫里 4.再調用方法把返回值又傳遞到前臺,前臺直接展示我們輸入的內容 前臺 html代碼 @model ...
  • EF Core一次準備多個語句,然後在單次請求中執行它們,所以能提供了更好的性能和速度。本文將介紹它是如何工作的。 ...
  • Visual Studio Ultimate 2013 KEY(密鑰):BWG7X-J98B3-W34RT-33B3R-JVYW9Visual Studio Premium 2013 KEY(密鑰):FBJVC-3CMTX-D8DVP-RTQCT-92494Visual Studio Profess ...
  • WPF中的轉換器是一個非常好的數據類型轉換解決方案,實用和強大, 它的作用是將源數據轉換為WPF自身需要的類型,對數據實體沒有侵略性,會在項目工程中頻繁使用。所以掌握轉換器是WPF開發的必備技能。 我剛接觸轉換器的時候,沒有考慮通用性,每次遇到一個轉換需求都會去創建一個新的轉換器,久而久之,項目中的 ...
  • 可能很多Java的初學者對String的存儲和賦值有迷惑,以下是一個很簡單的測試用例,你只需要花幾分鐘時間便可理解。 1.在看例子之前,確保你理解以下幾個術語: 棧:由JVM分配區域,用於保存線程執行的動作和數據引用。棧是一個運行的單位,Java中一個線程就會相應有一個線程棧與之對應。 堆:由JVM ...
  • 解決python2.7中re模塊的search使用utf8的str出問題,然後做個總結。 ...
  • * 在頁面中使用el表達式如${param.username},相當於在後臺程式(如Servlet)中調用request.getParameter("username"); * 編程中,在頁面中使用el表達式,如 ${param.username} 也可以取到ValueStack中Property ...
  • CyclicBarrier類似於CountDownLatch也是個計數器, 不同的是CyclicBarrier數的是調用了CyclicBarrier.await()進入等待的線程數, 當線程數達到了CyclicBarrier初始時規定的數目時,所有進入等待狀態的線程被喚醒並繼續。 CyclicBar... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...