Go 語(yǔ)言學(xué)習(xí)筆記-文件操作

打開朱躺、創(chuàng)建文件

  • 創(chuàng)建文件 Create

    file, err := os.Create("F:/futureWeb/goLang/testFile.go")
    
    • 參數(shù):name。打開文件的路徑:絕對(duì)路徑、相對(duì)路徑
    • 目錄分隔符:/
    • 文件不存在,則創(chuàng)建摩钙。文件存在,則將文件內(nèi)容清空查辩。
  • 打開文件 Open

    • 參數(shù):name胖笛。打開文件的路徑:絕對(duì)路徑网持、相對(duì)路徑
    • 以只讀方式打開文件。文件不存在长踊,則打開失敗功舀。
    f, err := os.Open("F:/futureWeb/goLang/testFile.go")
    
  • 打開文件 OpenFile

    f, err := os.OpenFile("F:/futureWeb/goLang/testFile.go", os.O_RDONLY, 6)
    
    • 參數(shù)1:name。打開文件的路徑:絕對(duì)路徑身弊、相對(duì)路徑
    • 參數(shù)2:打開文件權(quán)限:O_RDONLY(只讀模式)辟汰、O_WRONLY(只寫模式)、O_RDWR(可讀可寫模式)阱佛、O_APPEND(追加模式)帖汞。
    • 參數(shù)3:perm,表權(quán)限取值范圍(0-7)一般傳 6
      • 0:沒(méi)有任何權(quán)限
      • 1:執(zhí)行權(quán)限(如果是可執(zhí)行文件凑术,是可以運(yùn)行的)
      • 2:寫權(quán)限
      • 3:寫權(quán)限與執(zhí)行權(quán)限
      • 4:讀權(quán)限
      • 5:讀權(quán)限與執(zhí)行權(quán)限
      • 6:讀權(quán)限與寫權(quán)限
      • 7:讀權(quán)限翩蘸、寫權(quán)限、執(zhí)行權(quán)限

寫文件

  • 按字符串寫:

    n, err := f.WriteString("123")
    
    • n:寫入的字符個(gè)數(shù)
    • 回車換行:windows: \r\n, Linux: \n
  • 按位置寫:

      off, _ := f.Seek(10, io.SeekEnd)
    
    • 參數(shù)1:偏移量淮逊。正:向文件未偏催首,負(fù):向文件頭偏
    • 參數(shù)2:偏移起始位置
      • io.SeekStart:文件起始位置
      • io.SeekCurrent:文件當(dāng)前位置
      • io.SeekEnd:文件結(jié)尾位置
    • 返回值:表示從文件起始位置,到當(dāng)前讀寫指針位置的偏移量
  • 按字節(jié)寫:

      n, _ := f.WriteAt([]byte("111"), 10)
    
    • WriteAt():在文件指定偏移位置泄鹏,寫入 []byte, 通常搭配 Seek()
    • 參數(shù)1:待寫入數(shù)據(jù)
    • 參數(shù)2:偏移量
    • 返回值:實(shí)際寫出的字節(jié)數(shù)

讀文件

  • 按行讀

    1. 創(chuàng)建一個(gè)帶有緩沖區(qū)的 Reader(讀寫器)

      reader := bufio.NewReader(f)  // f: 打開的文件指針
      
    2. 從 Reader 的緩沖區(qū)中郎任,讀取指定長(zhǎng)度的數(shù)據(jù)。數(shù)據(jù)長(zhǎng)度取決于 參數(shù)(dlime)

      buf, er := reader.ReadBytes('\n')   // 按行讀 
      

    判斷到達(dá)文件結(jié)尾:if err != nil && err == io.EOF 到文件結(jié)尾
    文件結(jié)尾標(biāo)識(shí)是要單獨(dú)讀一次獲取到的命满。

    緩沖區(qū):內(nèi)存中的一塊區(qū)域涝滴,用來(lái)減少物理磁盤訪問(wèn)操作。

  • 按字節(jié)讀文件

    read([]byte)
    

刪文件

  • Remove
  func Remove(name string) Error

調(diào)用該函數(shù)就可以刪除文件名為 name 的文件

目錄操作

  • 打開目錄:os.OpenFile

    f, err := os.OpenFile(path, os.O_WRONLY, os.ModeDir)
    
    • 打開目錄 OpenFile:以只讀方式打開目錄胶台。
    • 參數(shù)1:name歼疮,打開目錄的路徑:絕對(duì)路徑、相對(duì)路徑
    • 參數(shù)2:打開目錄權(quán)限:O_RDONLY
    • 參數(shù)3:os.ModeDir
    • 返回值:返回一個(gè)可以讀目錄的文件指針
  • 讀目錄:Readdir

    info, err := f.Readdir(-1)
    
    • 參數(shù):想要打開的目錄項(xiàng)個(gè)數(shù)诈唬。-1韩脏,表示所有。
    • 返回值:FileInfo
    • 原型:
      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() interface{}  // underlying data source (can return nil)
      }
      
      func(f *File) Readdir(n int) ([]FileInfo, err) {
        FileInfo
      }
      
  • 直接讀目錄:ioutil.ReadDir

    info, err := ioutil.ReadDir(path)
    
    • 參數(shù):path铸磅,打開目錄的路徑:絕對(duì)路徑赡矢、相對(duì)路徑
  • 其他目錄操作

    • 將當(dāng)前工作目錄修改為 dir 指定的目錄

      func Chdir(dir string) error
      
    • 返回當(dāng)前工作目錄的絕對(duì)路徑

      func Getwd(dir string, err error)
      
    • 使用指定的權(quán)限和名稱創(chuàng)建一個(gè)目錄

      func MKdir(name string, perm FileMode) error
      

使用案例:查詢單詞在目錄中出現(xiàn)的次數(shù)

package main

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

func readFile(path, word string) int {
    fp, err := os.Open(path)
    if err != nil {
        fmt.Println("Open error: ", err)
    }
    defer fp.Close()

    row := bufio.NewReader(fp)      // 創(chuàng)建一個(gè)reader
    var total int = 0       // 統(tǒng)計(jì)單詞總數(shù)的變量

    for {
        buf, err := row.ReadBytes('\n')
        if err != nil && err == io.EOF {
            break
        }
        total += wordCount(string(buf[:]), word)
    }
    return total
}

func wordCount(s, word string) int {
    arr := strings.Fields(s)    //分割字符串,存入數(shù)組

    m := make(map[string]int)

    //對(duì) arr 中的每個(gè)單詞進(jìn)行循環(huán)阅仔,存入 map 中統(tǒng)計(jì)
    for i := 0; i < len(arr); i++ {
        m[arr[i]] ++
    }

    for k, v := range m {
        if k == word {
            fmt.Printf("%s : %d\n", k, v)
            return m[k]
        }
    }
    return 0
}

//從一個(gè)文件中逐行讀取內(nèi)容吹散,統(tǒng)計(jì)該文件共有多少個(gè)單詞
func main() {
    fmt.Println("請(qǐng)輸入需要查詢的目錄:")
    var path string     // 獲取用戶指定的目錄名
    fmt.Scan(&path)
    fmt.Println("請(qǐng)輸入需要查詢的單詞:")
    var word string     // 獲取用戶指定的單詞
    fmt.Scan(&word)

    if !strings.HasSuffix(path, "/") {
        path += "/"
    }

    fileList, _ := ioutil.ReadDir(path)

    var allCount int = 0
    for _, fileInfo := range fileList {
        if !fileInfo.IsDir() {
            s := fileInfo.Name()
            if strings.HasSuffix(s, ".txt") {
                allCount += readFile(path + s, word)
            }
        }
    }
    fmt.Printf("目錄所有文件中共有 %d 個(gè) %s", allCount, word)
}

https://studygolang.com/pkgdoc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市八酒,隨后出現(xiàn)的幾起案子空民,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界轩,死亡現(xiàn)場(chǎng)離奇詭異画饥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浊猾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門抖甘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人葫慎,你說(shuō)我怎么就攤上這事衔彻。” “怎么了幅疼?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵米奸,是天一觀的道長(zhǎng)昼接。 經(jīng)常有香客問(wèn)我爽篷,道長(zhǎng),這世上最難降的妖魔是什么慢睡? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任逐工,我火速辦了婚禮,結(jié)果婚禮上漂辐,老公的妹妹穿的比我還像新娘泪喊。我一直安慰自己,他們只是感情好髓涯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布袒啼。 她就那樣靜靜地躺著,像睡著了一般纬纪。 火紅的嫁衣襯著肌膚如雪蚓再。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天包各,我揣著相機(jī)與錄音摘仅,去河邊找鬼。 笑死问畅,一個(gè)胖子當(dāng)著我的面吹牛娃属,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播护姆,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矾端,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卵皂?” 一聲冷哼從身側(cè)響起秩铆,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渐裂,沒(méi)想到半個(gè)月后豺旬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钠惩,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年族阅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篓跛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坦刀,死狀恐怖愧沟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲤遥,我是刑警寧澤沐寺,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站盖奈,受9級(jí)特大地震影響混坞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钢坦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一究孕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爹凹,春花似錦厨诸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颤陶,卻和暖如春颗管,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背指郁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工忙上, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲坎。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓疫粥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親腰懂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梗逮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容