golang復(fù)制文件夾移動(dòng)到另一個(gè)文件夾實(shí)現(xiàn)方法詳解
一、背景
最近在寫自動(dòng)化配置程序(七鏡將來會(huì)將其開源),網(wǎng)上沒找著簡單明了的實(shí)現(xiàn)復(fù)制文件夾到另一個(gè)文件夾的golang實(shí)現(xiàn)方法,于是七鏡自己實(shí)現(xiàn)了一個(gè)。
二、源代碼
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ù)接受兩個(gè)字符串參數(shù),分別表示源文件夾和目標(biāo)文件夾的路徑
// 返回值是拷貝的文件數(shù)量和可能發(fā)生的錯(cuò)誤
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ù)接受四個(gè)字符串參數(shù),分別表示源文件夾和目標(biāo)文件夾的前綴和最后一級名稱
// 返回值是拷貝的文件數(shù)量和可能發(fā)生的錯(cuò)誤
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
}三、實(shí)現(xiàn)原理
- 輸入源文件夾路徑,目標(biāo)文件夾路徑,實(shí)現(xiàn)一個(gè)函數(shù)迭代源文件夾路徑中的所有文件和目錄;
- 如果是目錄則繼續(xù)遞歸調(diào)用這個(gè)函數(shù);
- 如果是文件,就將文件復(fù)制到目標(biāo)文件夾路徑下。
以上就是golang復(fù)制文件夾并移動(dòng)到另一個(gè)文件夾實(shí)現(xiàn)方法詳解的詳細(xì)內(nèi)容,更多關(guān)于golang復(fù)制文件夾的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go Resiliency庫中timeout實(shí)現(xiàn)原理及源碼解析
Go-Resiliency庫中的timeout是一種基于協(xié)程的超時(shí)機(jī)制,通過創(chuàng)建協(xié)程來執(zhí)行任務(wù)并設(shè)置超時(shí)時(shí)間,若任務(wù)執(zhí)行時(shí)間超時(shí)則中止協(xié)程并返回錯(cuò)誤,需要詳細(xì)了解可以參考下文2023-05-05
go語言定時(shí)器Timer及Ticker的功能使用示例詳解
這篇文章主要為大家介紹了go語言定時(shí)器的功能使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Golang?IOT中的數(shù)據(jù)序列化與解析過程
這篇文章主要介紹了Golang?IOT中的數(shù)據(jù)序列化與解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
基于Go語言實(shí)現(xiàn)類似tree命令的小程序
tree?命令是一個(gè)小型的跨平臺(tái)命令行程序,用于遞歸地以樹狀格式列出或顯示目錄的內(nèi)容。本文將通過Go語言實(shí)現(xiàn)類似tree命令的小程序,需要的可以參考一下2022-10-10
Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫使用實(shí)例
這篇文章主要為大家介紹了Golang AGScheduler動(dòng)態(tài)持久化任務(wù)調(diào)度的強(qiáng)大庫使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10

