Go語言學(xué)習(xí)教程(十三)

一扑眉、os包內(nèi)容介紹

* 使用os包中內(nèi)容進(jìn)行操作系統(tǒng)文件或目錄

* File結(jié)構(gòu)體表示操作系統(tǒng)文件(夾)

* 操作系統(tǒng)的文件都是有權(quán)限控制的,包含可讀,可寫等,在os包中FileMode表示文件權(quán)限,本質(zhì)是uint32,可取值都以常量形式提供

* FIleInfo是一個(gè)interface表示文件的信息

* 在獲取系統(tǒng)資源時(shí)資源路徑分為相對(duì)路徑和絕對(duì)路徑

* 相對(duì)路徑:在Go語言中相對(duì)路徑用于是GOPATH,也就是項(xiàng)目的根目錄

* 絕對(duì)路徑:磁盤根目錄開始表示資源詳細(xì)路徑的描述

* 創(chuàng)建文件夾

????/*

????如果文件夾已經(jīng)存在,不報(bào)錯(cuò),保留原文件夾

????如果父目錄不存在幫助創(chuàng)建

???? */

????error := os.MkdirAll("D:/godir/a/b", os.ModeDir)

????if error != nil {

????????fmt.Println("文件夾創(chuàng)建失敗",error)

????????return

????}

????fmt.Println("文件夾創(chuàng)建成功")

* 創(chuàng)建空文件

????/*

????創(chuàng)建文件時(shí)要求文件目錄必須已經(jīng)存在

????如果文件已經(jīng)存在則會(huì)創(chuàng)建一個(gè)空文件覆蓋之前的文件

???? */

????file, err := os.Create("D:/godir/test.txt")

????if err != nil {

????????fmt.Println("文件創(chuàng)建失敗,", err)

????????return

????}

????fmt.Println("文件創(chuàng)建成功",file.Name())

* 重命名文件或文件夾

????/*

????第一個(gè)參數(shù):原文件夾名稱,要求此路徑是必須存在的

????第二個(gè)參數(shù):新文件夾名稱

???? */

????err := os.Rename("D:/godir", "D:/godir1")

????if err != nil {

????????fmt.Println("重命名文件夾失敗,", err)

????????return

????}

????fmt.Println("文件夾重命名成功")

????/*

????重命名文件和重命名文件夾用法相同

???? */

????err = os.Rename("D:/godir1/test.txt", "D:/godir1/test1.txt")

????if err != nil {

????????fmt.Println("重命名文件失敗,", err)

????????return

????}

????fmt.Println("文件重命名成功")

* 獲取文件(夾)信息

????f, err := os.Open("D:/godir1/test1.txt")

????defer f.Close() //文件打開后要關(guān)閉,釋放資源

????if err != nil {

????????fmt.Println("打開文件失敗", err)

????????return

????}

????fileInfo, err := f.Stat()

????if err != nil {

????????fmt.Println("獲取文件信息失敗", err)

????????return

????}

????fmt.Println(fileInfo.Name())????//文件名

????fmt.Println(fileInfo.IsDir())???//是否是文件夾,返回bool,true表示文件夾,false表示文件

????fmt.Println(fileInfo.Mode())????//文件權(quán)限

????fmt.Println(fileInfo.ModTime()) //修改時(shí)間

????fmt.Println(fileInfo.Size())????//文件大小

* 刪除文件或文件夾

????/*

????只要文件夾存在,刪除文件夾.

????無論文件夾是否有內(nèi)容都會(huì)刪除

????如果刪除目標(biāo)是文件,則刪除文件

???? */

????err := os.RemoveAll("D:/godir1/a.txt")

????if err != nil {

????????fmt.Println("刪除失敗", err)

????????return

????}

????fmt.Println("刪除成功")

二个初、輸入流

* 流(stream)是應(yīng)用程序和外部資源進(jìn)行數(shù)據(jù)交互的紐帶

* 流分為輸入流和輸出流,輸入和輸出都是相對(duì)于程序,把外部數(shù)據(jù)傳入到程序中叫做輸入,反之叫做輸出流

* 輸入流(Input Stream)和輸出流(Output Stream)?就是平時(shí)所說的I/O流

* 在Go語言標(biāo)準(zhǔn)庫中io包下的Reader接口表示輸入流,只要實(shí)現(xiàn)這個(gè)接口就屬于輸入流

* 可以使用strings包下的NewReader創(chuàng)建字符串流

????r := strings.NewReader("hello 世界")

????b := make([]byte, r.Size())//創(chuàng)建字節(jié)切片,存放流中數(shù)據(jù),根據(jù)流數(shù)據(jù)大小創(chuàng)建切片大小

????n, err := r.Read(b)//把流中數(shù)據(jù)讀取到切片中

????if err != nil {

????????fmt.Println("讀取失敗,", err)

????????return

????}

????fmt.Println("讀取數(shù)據(jù)長度,", n)

????fmt.Println("流中數(shù)據(jù)",string(b))//以字符串形式輸入切片中數(shù)據(jù)

* 最常用的是文件流,把外部文件中數(shù)據(jù)讀取到程序中

????f, err := os.Open("D:/go.txt")//打開文件

????defer f.Close()

????if err != nil {

????????fmt.Println("文件讀取失敗,", err)

????????return

????}

????fileInfo, err := f.Stat()//獲取文件信息

????if err != nil {

????????fmt.Println("文件信息獲取失敗,", err)

????????return

????}

????b := make([]byte, fileInfo.Size())//根據(jù)文件中數(shù)據(jù)大小創(chuàng)建切片

????_, err = f.Read(b)//讀取數(shù)據(jù)到切片中

????if err != nil {

????????fmt.Println("文件流讀取失敗:", err)

????????return

????}

????fmt.Println("文件中內(nèi)容為:", string(b))//以字符串形式輸入切片中數(shù)據(jù)

三硝枉、輸出流

* 輸出流就是把程序中數(shù)據(jù)寫出到外部資源

* Go語言標(biāo)準(zhǔn)庫中輸出流是Writer接口

* 注意:輸出流時(shí)不要使用os.Open()抚笔,因?yàn)檫@種方式獲取的文件是只讀的

????fp := "D:/go.txt"

????/*

????第三個(gè)參數(shù)表示文件權(quán)限

????第 1 位在權(quán)限中總是為 0

????第 2 位為 0 表示文件不可以被讀, 為 1 表示可以被讀

????第 3 位為 0 表示文件不可以被寫衰倦, 為 1 表示可以被寫

????第 4 位為 0 表示文件不可以被執(zhí)行花鹅, 為 1 表示可以被執(zhí)行

????整理如下:

???????0(0000): 不可讀寫,不能被執(zhí)行

???????1(0001): 不可讀寫,能被執(zhí)行

???????2(0010): 可寫不可讀,不能被執(zhí)行

???????3(0011): 可寫不可讀,能被執(zhí)行

???????4(0100): 可讀不可寫,不能被執(zhí)行

???????5(0101): 可讀不可寫,能被執(zhí)行

???????6(0110): 可讀寫,不能執(zhí)行

???????7(0111): 可讀寫,可執(zhí)行

????0666:

????第一個(gè) 0 表示這個(gè)數(shù)是 八進(jìn)制

????第一個(gè) 6 表示文件擁有者有讀寫權(quán)限,但沒有執(zhí)行權(quán)限

????第二個(gè) 6 表示文件擁有者同組用戶有讀寫權(quán)限交掏,但沒有執(zhí)行權(quán)限

????第三個(gè) 6 表示其它用戶有讀寫權(quán)限妆偏,但沒有執(zhí)行權(quán)限

???? */

????//第二個(gè)參數(shù)表示文件內(nèi)容追加

????//第三個(gè)參數(shù)表示創(chuàng)建文件時(shí)文件權(quán)限

????f, err := os.OpenFile(fp, os.O_APPEND, 0660)

????defer f.Close()

????if err != nil {

????????fmt.Println("文件不存在,創(chuàng)建文件")

????????f, _ = os.Create(fp)

????}

????/*

????內(nèi)容中識(shí)別特殊字符

????\r\n 換行

????\t 縮進(jìn)

???? */

? ? // 使用文件對(duì)象重寫的Writer接口,參數(shù)是[]byte

????f.Write([]byte("使用Writer接口寫數(shù)據(jù)\r\n"))

? ? // 使用WriteString接口的方法,參數(shù)是字符串,使用更方便

????f.WriteString("寫了\t一段\r\n內(nèi)容123")

????fmt.Println("程序執(zhí)行結(jié)束")

四、ioutil包

* ioutil包下提供了對(duì)文件讀寫的工具函數(shù),通過這些函數(shù)快速實(shí)現(xiàn)文件的讀寫操作

* ioutil包下提供的函數(shù)比較少,但是都是很方便使用的函數(shù)

?? ?func NopCloser(r io.Reader) io.ReadCloser

?? ?func ReadAll(r io.Reader) ([]byte, error)

?? ?func ReadFile(filename string) ([]byte, error)

?? ?func WriteFile(filename string, data []byte, perm os.FileMode) error

?? ?func ReadDir(dirname string) ([]os.FileInfo, error)

?? ?func TempDir(dir, prefix string) (name string, err error)

?? ?func TempFile(dir, prefix string) (f *os.File, err error)

* 打開完文件后可以使用ReadAll把文件中所有內(nèi)容都讀取到

????f, err := os.Open("D:/go.txt")

????defer f.Close()

????if err != nil {

????????fmt.Println(err)

????????return

????}

????b, err := ioutil.ReadAll(f)

????if err != nil {

????????fmt.Println(err)

????????return

????}

????fmt.Println("文件中內(nèi)容:\n", string(b))

* 也可以直接讀取文件中內(nèi)容

?? ?b, err := ioutil.ReadFile("D:/go.txt")

????if err != nil {

????????fmt.Println(err)

????????return

????}

????fmt.Println(string(b))

* 寫文件也很簡(jiǎn)單,直接使用WriteFile函數(shù)即可,但是源碼中已經(jīng)規(guī)定此文件只能是可寫狀態(tài),且不是尾加數(shù)據(jù)

????err := ioutil.WriteFile("D:/abc.txt", []byte("內(nèi)容123123"), 0666)

????if err != nil {

????????fmt.Println(err)

????????return

????}

????fmt.Println("數(shù)據(jù)寫入成功")

* 還提供了快速獲取某個(gè)文件夾中所有文件信息的函數(shù)

????fs,_:=ioutil.ReadDir("D:/")

????for _,n := range fs {

????????fmt.Println(n.Name())

????}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盅弛,一起剝皮案震驚了整個(gè)濱河市钱骂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熊尉,老刑警劉巖罐柳,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異狰住,居然都是意外死亡张吉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門催植,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肮蛹,“玉大人,你說我怎么就攤上這事创南÷字遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵稿辙,是天一觀的道長昆码。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么赋咽? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任旧噪,我火速辦了婚禮,結(jié)果婚禮上脓匿,老公的妹妹穿的比我還像新娘淘钟。我一直安慰自己,他們只是感情好陪毡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布米母。 她就那樣靜靜地躺著,像睡著了一般毡琉。 火紅的嫁衣襯著肌膚如雪铁瞒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天绊起,我揣著相機(jī)與錄音精拟,去河邊找鬼。 笑死虱歪,一個(gè)胖子當(dāng)著我的面吹牛蜂绎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笋鄙,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼师枣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了萧落?” 一聲冷哼從身側(cè)響起践美,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎找岖,沒想到半個(gè)月后陨倡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡许布,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年兴革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜唾。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杂曲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袁余,到底是詐尸還是另有隱情擎勘,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布颖榜,位于F島的核電站棚饵,受9級(jí)特大地震影響煤裙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蟹地,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一积暖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怪与,春花似錦、人聲如沸缅疟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽存淫。三九已至耘斩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桅咆,已是汗流浹背括授。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岩饼,地道東北人荚虚。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像籍茧,于是被迫代替她去往敵國和親版述。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 一寞冯、斷言 * 只要實(shí)現(xiàn)了接口的全部方法就認(rèn)為這個(gè)類型屬于接口類型,如果編寫一個(gè)接口,這個(gè)接口中沒有任何方法,這時(shí)認(rèn)...
    小陳工閱讀 277評(píng)論 0 4
  • 一渴析、匿名函數(shù) * 匿名函數(shù)就是沒有名稱的函數(shù) * 正常函數(shù)可以通過名稱多次調(diào)用,而匿名函數(shù)由于沒有函數(shù)名,所以大部...
    小陳工閱讀 509評(píng)論 0 2
  • Go 語言的基礎(chǔ)組成有以下幾個(gè)部分:包聲明 引入包 函數(shù) 變量 語句 & 表達(dá)式 注釋 當(dāng)標(biāo)識(shí)符(包括常量、變量吮龄、...
    安然在路上閱讀 250評(píng)論 0 0
  • 一俭茧、Go語言簡(jiǎn)介 Go語言是谷歌公司于2009年11月發(fā)布的編程語言。Go語言是一種開源的程序設(shè)計(jì)語言,它使得開發(fā)...
    小陳工閱讀 1,642評(píng)論 1 2
  • Go在網(wǎng)絡(luò)處理方面是非常強(qiáng)大漓帚,提供完整并簡(jiǎn)單的包母债,使用者很容易上手使用這些包。 一 HTTP 》HttpClien...
    孫小兵閱讀 772評(píng)論 0 1