一、背景介紹
在日常工作中,經常需要將一個目錄下的文件複製到另一個目錄或者將一個文件複製到另一個文件。GolangCopy就是基於Go語言實現的文件複製工具。
二、主要功能
GolangCopy實現了以下主要功能:
- 複製單個文件
- 複製整個目錄
- 支持指定目標目錄
- 支持文件覆蓋
三、代碼實現
以下為GolangCopy的主要代碼實現,核心的文件複製函數是CopyFile,代碼解釋在注釋中:
package main
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
)
// 複製單個文件
func CopyFile(src, dst string) (err error) {
// 打開源文件
fi, err := os.Open(src)
if err != nil {
return
}
defer fi.Close()
// 創建目標文件
fo, err := os.Create(dst)
if err != nil {
return
}
defer func() {
if errFo := fo.Close(); errFo != nil {
err = errFo
}
}()
// 複製文件內容
_, err = io.Copy(fo, fi)
if err != nil {
return
}
// 獲取源文件信息
fiStat, err := fi.Stat()
if err != nil {
return
}
// 修改目標文件的權限和時間戳
err = os.Chmod(dst, fiStat.Mode())
if err != nil {
return
}
err = os.Chtimes(dst, fiStat.ModTime(), fiStat.ModTime())
if err != nil {
return
}
return
}
// 複製整個目錄
func CopyDir(src, dst string) (err error) {
// 獲取源目錄信息
srcInfo, err := os.Stat(src)
if err != nil {
return
}
// 創建目標目錄
err = os.MkdirAll(dst, srcInfo.Mode())
if err != nil {
return
}
// 獲取源目錄下的文件列表
files, err := ioutil.ReadDir(src)
if err != nil {
return
}
// 循環複製文件
for _, file := range files {
srcFile := filepath.Join(src, file.Name())
dstFile := filepath.Join(dst, file.Name())
if file.IsDir() {
// 遞歸複製子目錄
err = CopyDir(srcFile, dstFile)
if err != nil {
return
}
} else {
// 複製文件
err = CopyFile(srcFile, dstFile)
if err != nil {
return
}
}
}
return
}
func main() {
// 複製單個文件
err := CopyFile("./src/test.txt", "./dst/test.txt")
if err != nil {
fmt.Println(err)
return
}
// 複製整個目錄
err = CopyDir("./src", "./dst")
if err != nil {
fmt.Println(err)
return
}
}
四、總結
通過簡單的代碼實現,我們實現了一個基於Go語言的文件複製工具GolangCopy。這個工具可以幫助我們快速、高效地將文件複製到指定目錄中。在實際應用中,我們可以根據具體需求對代碼進行調整,以滿足不同場景的需求。
原創文章,作者:WAAMY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361851.html