以下是《Go語言100個實戰案例》中的?文件與IO操作篇 - 案例21:合并多個文本文件為一個?的完整內容,適用于初學者學習文件讀取與寫入的綜合運用。
🎯 案例目標
使用 Go 語言將指定目錄下的多個?.txt
?文件,合并成一個新的總文件。
🧩 應用場景
- ? 將多個日志、分段文檔、數據文件整合為單個文件
- ? 文件歸檔、匯總導出操作
- ? 初學者鍛煉文件操作能力的實戰案例
🧠 涉及知識點
- ? 遍歷目錄讀取所有?
.txt
?文件 - ? 使用?
bufio
、os
?進行文件讀取與寫入 - ? 文件拼接的順序與內容處理
📂 示例文件結構(同一目錄下)
data/
├──?part1.txt
├──?part2.txt
└──?part3.txt
💻 示例代碼:合并文本文件
package?mainimport?("bufio""fmt""io""os""path/filepath"
)func?main()?{inputDir?:=?"./data"?????????????//?輸入目錄outputFile?:=?"merged_output.txt"?//?輸出文件名//?創建輸出文件out,?err?:=?os.Create(outputFile)if?err?!=?nil?{fmt.Println("創建輸出文件失敗:",?err)return}defer?out.Close()//?遍歷目錄下所有?.txt?文件err?=?filepath.Walk(inputDir,?func(path?string,?info?os.FileInfo,?err?error)?error?{if?err?!=?nil?{return?err}//?只處理?.txt?文件if?!info.IsDir()?&&?filepath.Ext(path)?==?".txt"?{fmt.Println("正在合并文件:",?path)err?:=?appendFileContent(path,?out)if?err?!=?nil?{fmt.Println("合并失敗:",?err)}}return?nil})if?err?!=?nil?{fmt.Println("遍歷目錄出錯:",?err)return}fmt.Println("所有文件合并完成,輸出為:",?outputFile)
}//?將單個文件內容追加到輸出文件
func?appendFileContent(filePath?string,?out?*os.File)?error?{in,?err?:=?os.Open(filePath)if?err?!=?nil?{return?err}defer?in.Close()reader?:=?bufio.NewReader(in)_,?err?=?io.Copy(out,?reader)if?err?!=?nil?{return?err}//?每個文件內容后加換行分隔_,?err?=?out.WriteString("\n")return?err
}
📤 合并結果(merged_output.txt)
內容會按照文件遍歷順序依次寫入,內容中間自動添加換行分隔。例如:
[part1.txt?內容]
...
[part2.txt?內容]
...
[part3.txt?內容]
🛠 技術說明
功能 | 使用 |
遍歷目錄 | filepath.Walk |
打開文件 | os.Open ,?os.Create |
讀取寫入 | bufio.NewReader ,?io.Copy |
判斷文件類型 | info.IsDir() ,?filepath.Ext() |
🔄 可選優化方向
- ? 對文件名排序后再合并
- ? 跳過空文件或大小為 0 的文件
- ? 每段前添加注釋?
// 文件名:xxx.txt
- ? 增加合并進度提示或統計信息
? 小結
該案例通過完整示例演示了如何使用 Go 語言合并多個文本文件,幫助你熟練掌握文件遍歷、讀取、寫入、擴展處理等實用技能,是文件處理場景的常見需求。