golang復(fù)制文件夾移動到另一個文件夾實現(xiàn)方法詳解
更新時間:2023年07月05日 12:00:33 作者:七鏡
這篇文章主要為大家介紹了golang復(fù)制文件夾并移動到另一個文件夾實現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
一、背景
最近在寫自動化配置程序(七鏡將來會將其開源),網(wǎng)上沒找著簡單明了的實現(xiàn)復(fù)制文件夾到另一個文件夾的golang實現(xiàn)方法,于是七鏡自己實現(xiàn)了一個。
二、源代碼
package main
import (
"log"
"os"
"regexp"
"strings"
)
func main() {
// 調(diào)用 CopyDir 函數(shù),將源文件夾下的所有文件和子文件夾拷貝到目標(biāo)文件夾
count, err := CopyDir("E:\\personal\\golang\\config\\webserver", ".\\output")
if err != nil {
log.Fatal(err)
}
log.Println(count)
}
// CopyDir 函數(shù)接受兩個字符串參數(shù),分別表示源文件夾和目標(biāo)文件夾的路徑
// 返回值是拷貝的文件數(shù)量和可能發(fā)生的錯誤
func CopyDir(src, dst string) (count int, err error) {
// 使用正則表達(dá)式將路徑按照 / 或 \ 分割成切片
regexp1, err := regexp.Compile(`(/|\\)`)
if err != nil {
return 0, err
}
srcSplits := regexp1.Split(src, 10000)
dstSplits := regexp1.Split(dst, 10000)
// 調(diào)用 CopyDirInner 函數(shù),傳入源文件夾和目標(biāo)文件夾的前綴和最后一級名稱
return CopyDirInner(strings.Join(srcSplits[:len(srcSplits)-1], "/"), srcSplits[len(srcSplits)-1], strings.Join(dstSplits[:len(dstSplits)-1], "/"), dstSplits[len(dstSplits)-1])
}
// CopyDirInner 函數(shù)接受四個字符串參數(shù),分別表示源文件夾和目標(biāo)文件夾的前綴和最后一級名稱
// 返回值是拷貝的文件數(shù)量和可能發(fā)生的錯誤
func CopyDirInner(srcPrefix, src string, dstPrefix, dst string) (count int, err error) {
// 如果前綴為空,則設(shè)置為當(dāng)前目錄
if srcPrefix == "" {
srcPrefix = "."
}
if dstPrefix == "" {
dstPrefix = "."
}
// 讀取源文件夾下的所有文件和子文件夾
dirs, err := os.ReadDir(srcPrefix + "/" + src)
if err != nil {
return 0, err
}
// 在目標(biāo)文件夾下創(chuàng)建同名的子文件夾
pathCursor := dstPrefix + "/" + dst + "/" + src
err = os.MkdirAll(pathCursor, 0600)
if err != nil {
return 0, err
}
for _, dir := range dirs {
if dir.IsDir() {
// 如果是子文件夾,則遞歸調(diào)用 CopyDirInner 函數(shù),傳入相應(yīng)的參數(shù)
countSub, err := CopyDirInner(srcPrefix+"/"+src, dir.Name(), dstPrefix+"/"+dst, src)
if err != nil {
return 0, err
}
count += countSub
} else {
// 如果是文件,則讀取其內(nèi)容,并寫入到目標(biāo)文件夾下同名的文件中
bytesFile, err := os.ReadFile(srcPrefix + "/" + src + "/" + dir.Name())
if err != nil {
return 0, err
}
err = os.WriteFile(pathCursor+"/"+dir.Name(), bytesFile, 0600)
if err != nil {
return 0, err
}
count++
}
}
return count, nil
}三、實現(xiàn)原理
- 輸入源文件夾路徑,目標(biāo)文件夾路徑,實現(xiàn)一個函數(shù)迭代源文件夾路徑中的所有文件和目錄;
- 如果是目錄則繼續(xù)遞歸調(diào)用這個函數(shù);
- 如果是文件,就將文件復(fù)制到目標(biāo)文件夾路徑下。
以上就是golang復(fù)制文件夾并移動到另一個文件夾實現(xiàn)方法詳解的詳細(xì)內(nèi)容,更多關(guān)于golang復(fù)制文件夾的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go Resiliency庫中timeout實現(xiàn)原理及源碼解析
Go-Resiliency庫中的timeout是一種基于協(xié)程的超時機(jī)制,通過創(chuàng)建協(xié)程來執(zhí)行任務(wù)并設(shè)置超時時間,若任務(wù)執(zhí)行時間超時則中止協(xié)程并返回錯誤,需要詳細(xì)了解可以參考下文2023-05-05
Golang?IOT中的數(shù)據(jù)序列化與解析過程
這篇文章主要介紹了Golang?IOT中的數(shù)據(jù)序列化與解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
Golang AGScheduler動態(tài)持久化任務(wù)調(diào)度的強大庫使用實例
這篇文章主要為大家介紹了Golang AGScheduler動態(tài)持久化任務(wù)調(diào)度的強大庫使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

