golang復(fù)制文件夾移動到另一個文件夾實(shí)現(xiàn)方法詳解
一、背景
最近在寫自動化配置程序(七鏡將來會將其開源),網(wǎng)上沒找著簡單明了的實(shí)現(xiàn)復(fù)制文件夾到另一個文件夾的golang實(shí)現(xiàn)方法,于是七鏡自己實(shí)現(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 }
三、實(shí)現(xiàn)原理
- 輸入源文件夾路徑,目標(biāo)文件夾路徑,實(shí)現(xiàn)一個函數(shù)迭代源文件夾路徑中的所有文件和目錄;
- 如果是目錄則繼續(xù)遞歸調(diào)用這個函數(shù);
- 如果是文件,就將文件復(fù)制到目標(biāo)文件夾路徑下。
以上就是golang復(fù)制文件夾并移動到另一個文件夾實(shí)現(xiàn)方法詳解的詳細(xì)內(nèi)容,更多關(guān)于golang復(fù)制文件夾的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫內(nèi)存實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis數(shù)據(jù)庫內(nèi)存實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go語言開發(fā)編程規(guī)范命令風(fēng)格代碼格式
這篇文章主要為大家介紹了Go語言開發(fā)編程規(guī)范命令風(fēng)格代碼格式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go語言超時退出的三種實(shí)現(xiàn)方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語言中超時退出的三種實(shí)現(xiàn)方式,文中的示例代碼簡潔易懂,對我們深入了解Go語言有一定的幫助,需要的可以了解一下2023-06-06Web框架Gin中間件實(shí)現(xiàn)原理步驟解析
這篇文章主要為大家介紹了Web框架Gin中間件實(shí)現(xiàn)原理步驟解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Go中各種newreader和newbuffer的使用總結(jié)
這篇文章主要為大家詳細(xì)介紹了Go語言中各種newreader和newbuffer的使用的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴可以了解下2023-11-11Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn)
這篇文章主要介紹了Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Go語言的文件名、標(biāo)識符、關(guān)鍵字和包基礎(chǔ)教程
Go的關(guān)鍵字不能被用作標(biāo)識符,這是一個重要的限制,以避免命名沖突和語法混淆,這篇文章主要給大家介紹了關(guān)于Go語言文件名、標(biāo)識符、關(guān)鍵字和包的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06