GO系列-IO 文件操作

os io

判斷文件是否存在

func fileExist(filePath string) (bool, error) {_, err := os.Stat(filePath)if err == nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath}
}

讀取文件內容

func readFileContext(file *os.File) (string, error) {if file == nil {return "", nil}var buf [1024]bytevar content []bytefor {n, err := file.Read(buf[:])if err == io.EOF {//結尾break} else if err != nil {log.Println("Read file error", file.Name())return "", err}content = append(content, buf[:n]...)}return string(content), nil
}

創建文件&寫入文件內容

// 如果不存在 則創建
if !exist {log.Println("create file:", filePath)newFile, err := os.Create(filePath)if err != nil {log.Panicln(err.Error())}// 寫入文件newFile.WriteString("Hello word !!!\n")newFile.Write([]byte("happy every day\n"))newFile.Close()
}

打開文件

// 打開這個文件
file1, err := os.Open(filePath)
if err != nil {log.Panicln(err.Error())
}

關閉和刪除文件

// 刪除前關閉文件,否則報錯
file1.Close()// 刪除文件
stat1, _ := file1.Stat()
if stat1 != nil {log.Println("file is not closed")
}
err = os.Remove(filePath)
if err != nil {log.Println("remove file error", filePath, err.Error())
}
log.Println("remove file success", filePath)

copy文件

func copyFile(filePath1 string, filePath2 string) error {exist, err := fileExist(filePath1)if err != nil {return err}if !exist {log.Println("file1 must exist ")return nil}file1, err := os.Open(filePath1)if err != nil {log.Println("open file1 error")return err}defer file1.Close()// 如果存在則刪除exist, err = fileExist(filePath2)if err != nil {return err}if exist {os.Remove(filePath2)}file2, err := os.Create(filePath2)if err != nil {log.Println("create file2 error")return err}defer file2.Close()var buffer [1024]bytefor {n, err := file1.Read(buffer[:])if err == io.EOF {log.Println("copy complete")break}if err != nil {log.Println("copy error")return err}file2.Write(buffer[:n])}return nil
}

綜合示例

package mainimport ("io""log""os"
)type CheckFileExistError struct {FilePath string
}func (err CheckFileExistError) Error() string {return "Check File[" + err.FilePath + "] Exist Error"
}func fileExist(filePath string) (bool, error) {_, err := os.Stat(filePath)if err == nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath}
}func readFileContext(file *os.File) (string, error) {if file == nil {return "", nil}var buf [1024]bytevar content []bytefor {n, err := file.Read(buf[:])if err == io.EOF {//結尾break} else if err != nil {log.Println("Read file error", file.Name())return "", err}content = append(content, buf[:n]...)}return string(content), nil
}func copyFile(filePath1 string, filePath2 string) error {exist, err := fileExist(filePath1)if err != nil {return err}if !exist {log.Println("file1 must exist ")return nil}file1, err := os.Open(filePath1)if err != nil {log.Println("open file1 error")return err}defer file1.Close()// 如果存在則刪除exist, err = fileExist(filePath2)if err != nil {return err}if exist {os.Remove(filePath2)}file2, err := os.Create(filePath2)if err != nil {log.Println("create file2 error")return err}defer file2.Close()var buffer [1024]bytefor {n, err := file1.Read(buffer[:])if err == io.EOF {log.Println("copy complete")break}if err != nil {log.Println("copy error")return err}file2.Write(buffer[:n])}return nil
}func main() {log.Println("main ...")filePath := "./test.txt"filePath2 := "./test2.txt"exist, err := fileExist(filePath)log.Println("file ", filePath, "exist:", exist)if err != nil {log.Println(err.Error())}// 如果不存在 則創建if !exist {log.Println("create file:", filePath)newFile, err := os.Create(filePath)if err != nil {log.Panicln(err.Error())}// 寫入文件newFile.WriteString("Hello word !!!\n")newFile.Write([]byte("happy every day\n"))newFile.Close()}// 打開這個文件file1, err := os.Open(filePath)if err != nil {log.Panicln(err.Error())}// 讀取文件原始內容context, err := readFileContext(file1)if err != nil {log.Panicln(err.Error())}log.Println("context:", context)// 刪除前關閉文件,否則報錯file1.Close()// copy文件copyFile(filePath, filePath2)// 刪除文件stat1, _ := file1.Stat()if stat1 != nil {log.Println("file is not closed")}err = os.Remove(filePath)if err != nil {log.Println("remove file error", filePath, err.Error())}log.Println("remove file success", filePath)log.Println("success ..")
}

bufio

bufio包實現了帶緩沖區的讀寫,是對文件讀寫的封裝

bufio緩沖寫數據

模式?????? 含義

os.O_WRONLY???? 只寫

os.O_CREATE????? 創建文件

os.O_RDONLY????? 只讀

os.O_RDWR?? 讀寫

os.O_TRUNC 清空

os.O_APPEND????? 追加

package mainimport ("bufio""io""log""os"
)// 寫文件
func write(filePath string) {// 參數2:打開模式,所有模式d都在上面// 參數3是權限控制// w寫 r讀 x執行   w  2   r  4   x  1file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)if err != nil {return}defer file.Close()// 獲取writer對象writer := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString("hello\n")}// 刷新緩沖區,強制寫出writer.Flush()
}// 讀取文件
func read(filePath string) string {file, err := os.Open(filePath)if err != nil {return ""}defer file.Close()var content []bytereader := bufio.NewReader(file)for {line, _, err := reader.ReadLine()if err == io.EOF {break}if err != nil {return ""}content = append(content, []byte(string(line)+"\n")...)}return string(content)
}func main() {log.Println("main ...")filePath := "./test1.txt"write(filePath)content := read(filePath)log.Println(content)log.Println("success ..")
}

ioutil

package mainimport ("io/ioutil""log"
)func main() {log.Println("main ...")filePath := "./test1.txt"// 寫文件err := ioutil.WriteFile(filePath, []byte("hello word"), 0666)if err != nil {log.Println(err)return}// 讀取文件content, err := ioutil.ReadFile(filePath)if err != nil {log.Println(err)return}log.Println(string(content))log.Println("success ..")
}

控制臺輸入輸出

終端其實是一個文件,相關實例如下:

os.Stdin:標準輸入的文件實例,類型為*File

os.Stdout:標準輸出的文件實例,類型為*File

os.Stderr:標準錯誤輸出的文件實例,類型為*File

以文件的方式操作終端:

package mainimport ("log""os"
)func main() {log.Println("main ...")var buf [16]byte// 從控制臺讀取一行數據os.Stdin.Read(buf[:])log.Println("read context:", string(buf[:]))// 寫入到控制臺os.Stdout.WriteString("hello word\n")log.Println("success ..")
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70337.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rs485協議、電路詳解(保姆級)

起源 RS-485即Recommended Standard 485 協議的簡寫。1983年被電子工業協會(EIA)批準為一種通訊接口標準. 數據在通信雙方之間傳輸&#xff0c;本質是傳輸物理的電平&#xff0c;比方說傳輸5V的電壓 -1V的電壓信號&#xff0c;這些物理信號在傳輸過程中會受到很多干擾&#x…

JavaWeb-Tomcat服務器

文章目錄 Web服務器存在的意義關于Web服務器軟件Tomcat服務器簡介安裝Tomcat服務器Tomcat服務器源文件解析配置Tomcat的環境變量啟動Tomcat服務器一個最簡單的webapp(不涉及Java) Web服務器存在的意義 我們之前介紹過Web服務器進行通信的原理, 但是我們當時忘記了一點, 服務器…

【愚公系列】《Python網絡爬蟲從入門到精通》008-正則表達式基礎

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

視覺分析之邊緣檢測算法

9.1 Roberts算子 Roberts算子又稱為交叉微分算法&#xff0c;是基于交叉差分的梯度算法&#xff0c;通過局部差分計算檢測邊緣線條。 常用來處理具有陡峭的低噪聲圖像&#xff0c;當圖像邊緣接近于正45度或負45度時&#xff0c;該算法處理效果更理想。 其缺點是對邊緣的定位…

DuodooBMS源碼解讀之 sale_change模塊

銷售變更模塊用戶使用手冊 一、模塊概述 本擴展模塊主要包含兩個主要的 Python 文件&#xff1a;sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py&#xff0c;提供了銷售變更報表查看和銷售變更單下載的功能。以下是詳細的使用說明…

OpenCV形態學操作

1.1. 形態學操作介紹 初識&#xff1a; 形態學操作是一種基于圖像形狀的處理方法&#xff0c;主要用于分析和處理圖像中的幾何結構。其核心是通過結構元素&#xff08;卷積核&#xff09;對圖像進行掃描和操作&#xff0c;從而改變圖像的形狀和特征。例如&#xff1a; 腐蝕&…

力扣算法-1

力扣算法 1 兩數之和 給定一個整數數組nums和一個整數目標值target&#xff0c;請你在數組中找出和為目標值target的那兩個整數&#xff0c;返回他們的數組下標。 &#xff08;1&#xff09;暴力枚舉 &#xff08;枚舉數組每一個數x&#xff0c;再尋找數組中是否存在 targe…

pyside6學習專欄(三):自定義QLabel標簽擴展類QLabelEx

標簽是界面設計中最常用的控件&#xff0c;本文演示了如何基于PySide6的QLabex控件類擴展定義QLabelEX類&#xff0c;以實現更少的編碼完成各種圖像、彩色文本、動畫的加載和顯示&#xff0c;豐富界面顯示 本示例演示了QLabel和其擴展類QLabelEx分別顯示文本、圖像、動畫的使用…

從0到1:固件分析

固件分析 0x01 固件提取 1、從廠商官網下載 例如D-link的固件&#xff1a; https://support.dlink.com/resource/products/ 2、代理或鏡像設備更新時的流量 發起中間人攻擊MITM #啟用IP轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables&#xff0c;將目…

使用 Spring Boot 和 Canal 實現 MySQL 數據庫同步

文章目錄 前言一、背景二、Canal 簡介三、主庫數據庫配置1.主庫配置2.創建 Canal 用戶并授予權限 四.配置 Canal Server1.Canal Server 配置文件2.啟動 Canal Server 五.開發 Spring Boot 客戶端1. 引入依賴2. 配置 Canal 客戶端3. 實現數據同步邏輯 六.啟動并測試七.注意事項八…

Linux系統配置阿里云yum源,安裝docker

配置阿里云yum源 需要保證能夠訪問阿里云網站 可以先ping一下看看&#xff08;阿里云可能禁ping&#xff0c;只要能夠解析為正常的ip地址即可&#xff09; ping mirrors.aliyun.com腳本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…

后端開發:開啟技術世界的新大門

在互聯網的廣闊天地中&#xff0c;后端開發宛如一座大廈的基石&#xff0c;雖不直接與用戶 “面對面” 交流&#xff0c;卻默默地支撐著整個互聯網產品的穩定運行。它是服務器端編程的核心領域&#xff0c;負責處理數據、執行業務邏輯以及與數據庫和其他后端服務進行交互。在當…

銀河麒麟系統安裝mysql5.7【親測可行】

一、安裝環境 cpu&#xff1a;I5-10代&#xff1b; 主板&#xff1a;華碩&#xff1b; OS&#xff1a;銀河麒麟V10&#xff08;SP1&#xff09;未激活 架構&#xff1a;Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本&#xff1a;mysql-5.7.34-linux-glibc2.12-x86_64.ta…

從零開始學習PX4源碼9(部署px4源碼到gitee)

目錄 文章目錄 目錄摘要1.gitee上創建倉庫1.1 gitee上創建倉庫PX4代碼倉庫1.2 gitee上創建子倉庫2.固件在gitee部署過程2.1下載固件到本地2.2切換本地分支2.3修改.gitmodules內容2.4同步子模塊倉庫地址2.5同步子模塊倉庫地址更新(下載)子模塊3.一級子模塊和二級子模塊的映射關…

【回溯算法2】

力扣17.電話號碼的字母組合 鏈接: link 思路 這道題容易想到用嵌套的for循環實現&#xff0c;但是如果輸入的數字變多&#xff0c;嵌套的for循環也會變長&#xff0c;所以暴力破解的方法不合適。 可以定義一個map將數字和字母對應&#xff0c;這樣就可以獲得數字字母的映射了…

科普:“Docker Desktop”和“Docker”以及“WSL”

“Docker Desktop”和“Docker”這兩個概念既有緊密聯系&#xff0c;又存在一定區別&#xff1a; 一、聯系 核心功能同源&#xff1a;Docker Desktop 本質上是基于 Docker 核心技術構建的。Docker 是一個用于開發、部署和運行應用程序的開源平臺&#xff0c;它利用容器化技術…

Flutter 網絡請求與數據處理:從基礎到單例封裝

Flutter 網絡請求與數據處理&#xff1a;從基礎到單例封裝 在 Flutter 開發中&#xff0c;網絡請求是一個非常常見的需求&#xff0c;比如獲取 API 數據、上傳文件、處理分頁加載等。為了高效地處理網絡請求和數據管理&#xff0c;我們需要選擇合適的工具并進行合理的封裝。 …

虛擬表格實現全解析

在數據展示越來越復雜的今天&#xff0c;大量數據的渲染就像是“滿漢全席”——如果把所有菜肴一次性擺上桌&#xff0c;既浪費資源也讓人眼花繚亂。幸運的是&#xff0c;我們有兩種選擇&#xff1a; 自己動手&#xff1a;通過二次封裝 Element Plus 的表格組件&#xff0c;實…

QT 讀寫鎖

一、概述 1、讀寫鎖是一種線程同步機制&#xff0c;用于解決多線程環境下的讀寫競爭問題。 2、讀寫鎖允許多個線程同時獲取讀鎖&#xff08;共享訪問&#xff09;&#xff0c;但只允許一個線程獲取寫鎖&#xff08;獨占訪問&#xff09;。 3、這種機制可以提高并發性能&…

2025 vue3面試題匯總,通俗易懂

一、基礎概念與核心特性 1. Vue3 相比 Vue2 的改進&#xff08;通俗版&#xff09; 問題&#xff1a;Vue3 比 Vue2 好在哪&#xff1f; 答案&#xff1a; 更快&#xff1a; Proxy 代理&#xff1a;Vue2 的響應式像“逐個監聽保險箱”&#xff08;每個屬性單獨監聽&#xff0…