GO基礎之文件操作

来源:https://www.cnblogs.com/jalja/archive/2019/11/14/11854152.html
-Advertisement-
Play Games

向指定文件寫入數據,如果文件不存在,則創建文件,寫入數據之前清空文件 ...


一、文件操作的基本API

func main() {
    //絕對路徑
    fileInfo , err := os.Stat("E:/a.txt")
    fileInfo , err = os.Stat("E:/")
    if err !=nil {
        fmt.Println("err:" , err.Error())
    } else {
        fmt.Printf("%T \n" , fileInfo)
        fmt.Printf("%v \n" , fileInfo)
        //文件名
        fmt.Println(fileInfo.Name())
        //是否是目錄
        fmt.Println(fileInfo.IsDir())
        //文件尺寸大小
        fmt.Println(fileInfo.Size())
        //mode 許可權
        fmt.Println(fileInfo.Mode())
        //文件最後修改時間
        fmt.Println(fileInfo.ModTime())
    }
}

文件路徑:

  • 1、絕對路徑:absolute
  • 2、相對路徑:relative 都是相當於當前的工程  (.當前目錄   ..上一層)

(1)、判斷是否是絕對路徑filepath.IsAbs()
(2)、獲取相對路徑filepath.Rel()
(3)、獲取絕對路徑filepath.Abs()
(4)、拼接路徑path.Join()

文件操作:
1.創建文件夾,如果文件夾存在,創建失敗

  • os.MKdir()
  • os.MKdirAll()

2.創建文件:如果文件存在,會覆蓋

  • os.Create()-->*file

3.打開文件:

  • os.Open(filename)
  • os.OpenFile(filename,mode,perm)

4.關閉文件:

  • file.Close()

5.刪除:

  • os.Remove()
  • os.RemoveAll()
package main

import (
    "os"
    "fmt"
)

func main() {
    /*
    文件操作:
        1.創建文件夾,如果文件夾存在,創建失敗
            os.MKdir()
            os.MKdirAll()

        2.創建文件:如果文件存在,會覆蓋
            os.Create()-->*file

        3.打開文件:
            os.Open(filename)
            os.OpenFile(filename,mode,perm)
        4.關閉文件:
            file.Close()
        5.刪除:
            os.Remove()
            os.RemoveAll()
     */
    //     1、創建目錄
    fileName1 := "./test1"
    err := os.Mkdir(fileName1, os.ModePerm)
    if err != nil {
        fmt.Println("err:", err.Error())
    } else {
        fmt.Printf("%s 目錄創建成功!\n", fileName1)
    }

    fileName2 := "./test2/abc/xyz"
    err = os.MkdirAll(fileName2, os.ModePerm)
    if err != nil {
        fmt.Println("err:", err.Error())
    } else {
        fmt.Printf("%s 目錄創建成功!\n", fileName2)
    }

    //2、創建文件.如果文件已經存在,則文件被覆蓋
    fileName3 := "./test1/abc.txt"
    file1, err := os.Create(fileName3)
    if err != nil {
        fmt.Println("err:", err.Error())
    } else {
        fmt.Printf("%s 創建成功!%v \n", fileName3, file1)
    }

    //    3、打開文件
    file2, err := os.Open(fileName3)
    if err != nil {
        fmt.Println("err:", err.Error())
    } else {
        fmt.Printf("%s 打開成功!%v \n", fileName3, file2)
    }

    /*
    第一個參數:文件名稱
    第二個參數:文件的打開方式
        O_RDONLY:只讀模式(read-only)
        O_WRONLY:只寫模式(write-only)
        O_RDWR:讀寫模式(read-write)
        O_APPEND:追加模式(append)
        O_CREATE:文件不存在就創建(create a new file if none exists.)
    第三個參數:文件的許可權:文件不存在創建文件,需要指定許可權
     */
    fileName4 := "./test1/abc2.txt"
    file4, err := os.OpenFile(fileName4, os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err != nil {
        fmt.Println("err:", err.Error())
    } else {
        fmt.Printf("%s 打開成功!%v \n", fileName4, file4)
    }

    //4、關閉文件,程式與文件的聯繫斷開
    file4.Close()

    //    5、刪除文件和目錄
    fileName5 := "./test1"
    err = os.Remove(fileName5)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s 刪除成功!" , fileName5)
    }

    err = os.RemoveAll(fileName5)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s 刪除成功!" , fileName5)
    }
}
View Code

文件讀寫 

/**
2.讀取文件file.Read([]byte)-->n,err 從文件中開始讀取數據,存入到byte切片中,返回值n是本次實際讀取的數據量如果讀取到文件末尾,n為0,err為EOF:end of file
 */
func readFile(fileName string){
    file2,err:=os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err!=nil{
        fmt.Println(file2);
    }else {
        bs:=make([]byte,8,1024*8);
        n:= -1;
        str:="";
        for{
            n,err=file2.Read(bs);
            fmt.Printf("n:%v \n",n)
            if n==0||err==io.EOF{
                fmt.Println("read file end")
                break;
            }
            str= strings.Join([]string{str,string(bs[:n])},"")
        }
        fmt.Println(str)
    }
    //3、關閉文件
    file2.Close()
}
func writeFile(fileName string){
    str:="I Love China 我愛中國";
    bs:=[]byte(str);
    file2,err:=os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, os.ModePerm)
    if err!=nil{
        fmt.Println(file2);
    }else {
        file2.Write(bs);
    }
    file2.Close();
}
View Code

二、ioutil 包

/*
ioutil包:
ReadFile() //讀取文件中的所有的數據,返回讀取的位元組數組
WriteFile() //向指定文件寫入數據,如果文件不存在,則創建文件,寫入數據之前清空文件
ReadDir() //讀取一個目錄下的子內容:子文件和子目錄,但是僅有一層
TempDir() //在當前目錄下,創建一個以指定字元串為首碼的臨時文件夾,並返迴文件夾路徑
TempFile() //在當前目錄下,創建一個以指定字元串為首碼的文件,並以讀寫模式打開文件,並返回os.File指針對象
*/

package main

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

func main() {
    /*
    ioutil包:
        ReadFile()   //讀取文件中的所有的數據,返回讀取的位元組數組
        WriteFile()  //向指定文件寫入數據,如果文件不存在,則創建文件,寫入數據之前清空文件
        ReadDir()    //讀取一個目錄下的子內容:子文件和子目錄,但是僅有一層
        TempDir()   //在當前目錄下,創建一個以指定字元串為首碼的臨時文件夾,並返迴文件夾路徑
        TempFile()   //在當前目錄下,創建一個以指定字元串為首碼的文件,並以讀寫模式打開文件,並返回os.File指針對象
     */
    //1、ReadFile()   //讀取文件中的所有的數據,返回讀取的位元組數組
    fileName1 := "./files/blockchain.txt"
    data, err := ioutil.ReadFile(fileName1)
    if err != nil {
        fmt.Println("文件打開異常", err.Error())
    } else {
        fmt.Println(string(data))
    }

    //2、WriteFile()  //向指定文件寫入數據,如果文件不存在,則創建文件,寫入數據之前清空文件
    fileName2 := "./files/xyz.txt"
    s1 := "Steven陪你學區塊鏈"
    err = ioutil.WriteFile(fileName2, []byte(s1), 0777)
    if err != nil {
        fmt.Println("寫入文件異常", err.Error())
    } else {
        fmt.Println("文件寫入OK!")
    }

    //3、文件拷貝
    err = ioutil.WriteFile(fileName2 , data , os.ModePerm)
    if err != nil {
        fmt.Println("文件拷貝異常", err.Error())
    } else {
        fmt.Println("文件拷貝成功!")
    }

    //4、ReadDir()    //讀取一個目錄下的子內容:子文件和子目錄,但是僅有一層
    dirName := "./"
    fileInfos , err := ioutil.ReadDir(dirName)
    if err != nil {
        fmt.Println("目錄遍歷異常", err.Error())
    } else {
        for i , v := range fileInfos {
            fmt.Println(i , v.Name() , v.IsDir() , v.Size() , v.ModTime())
        }
    }

    //5、TempDir()   //在當前目錄下,創建一個以指定字元串為首碼的臨時文件夾,並返迴文件夾路徑
    filename , err := ioutil.TempDir("./" , "temp")
    if err != nil {
        fmt.Println("創建目錄失敗" , err.Error())
    } else {
        fmt.Println(filename)
    }

    //6、TempFile()   //在當前目錄下,創建一個以指定字元串為首碼的文件,並以讀寫模式打開文件,並返回os.File指針對象
    file1 , err := ioutil.TempFile(filename , "temp")
    if err != nil {
        fmt.Println("創建文件失敗" , err.Error())
    } else {
        file1.WriteString("寫入內容:" + file1.Name())
    }
    file1.Close()
}
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 例5 分解質因數 題目描述 將一個正整數分解質因數。例如:輸入90,輸出 90=2*3*3*5。 輸入 輸入數據包含多行,每行是一個正整數n (1<n <100000) 。 輸出 對於每個整數n將其分解質因數。 輸入樣例 90 256 199 輸出樣例 90=2*3*3*5 256=2*2*2*2* ...
  • 品優購 第2天 "學習目標" 目標1:運用AngularJS前端框架的常用指令 目標2:完成品牌管理的列表功能 目標3:完成品牌管理的分頁列表功能 目標4:完成品牌管理的增加功能 目標5:完成品牌管理的修改功能 目標6:完成品牌管理的刪除功能 目標7:完成品牌管理的條件查詢功能 目標N:通用Mapp ...
  • ### default過濾器: 使用方式:{{ value|default('預設值') }} 如果value這個“key”不存在,那麼就會使用default過濾器提供的預設值。如果你想使用類似python中判斷一個值是否為False(例如:None、空字元串、空列表、空字典等),那麼就必須要傳遞另 ...
  • ### 什麼是過濾器,語法是什麼: 1.有時候我們想要在模板中對一些變數進行處理,那麼就需要類似python中的函數一樣,可以將這個值傳到函數中,然後做一些操作。在模板中,過濾器相當於是一個函數,把當前的過濾器傳到變數中,然後過濾器根據自己的功能,再返回相應的值,之後再將結果渲染到頁面中。 2.基本 ...
  • ### url_for筆記: 模板中的“url_for”跟我們視圖函數中的“url_for”使用起來基本是一摸一樣的。也是傳遞視圖函數的名字,也是傳遞參數,使用的時候,用{{}}闊起來: 例如:{{ url_for('fun') }} app.py: from flask import Flask, ...
  • app.py: from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello_world(): context = { 'user': 'nvshen', 'age': 19, 'co ...
  • ### 模板預熱筆記: 1.在渲染模板的時候,預設會從項目根目錄下的“templetes”目錄下查找模板。 2.如果不想把模板文件放在“templetes”目錄下,那麼可以在flask初始化的時候指定"templete_folder"來指定模板的路徑。 代碼示例: from flask import ...
  • ### 視圖函數中可以返回哪些值: 1.可以返回字元串:返回的字元串其實底層將這個字元串包裝成了一個“Response”對象。 2.可以返回元組:元組的形式是(響應體,狀態碼,頭部信息),也不一定三個都要寫,寫兩個也是可以的,返回的元組,其實在底層也是包裝成了一個“Response”對象。 3.可以 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...