go實(shí)現(xiàn)自動復(fù)制U盤小工具demo
自動復(fù)制U盤小工具
最近在折騰 golang 寫了一個(gè) 關(guān)于 電腦 插入U(xiǎn)盤后會自動復(fù)制U盤中的內(nèi)容的 小工具, 但是 技術(shù)有限,出現(xiàn)了一下問題,放出代碼聽聽大家的意見
代碼如下
package main
import (
"io"
"strings"
"os"
"path/filepath"
"fmt"
"strconv"
"syscall"
"golang.org/x/sys/windows/registry"
)
// 獲取插入的U盤盤符
func GetUDisk() []string {
//查詢注冊表,判斷是否插入U(xiǎn)盤
k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SYSTEM\CurrentControlSet\Services\USBSTOR\Enum`, registry.QUERY_VALUE)
if err != nil {
fmt.Println("Not have U-Disk")
return nil
}
defer k.Close()
// 獲取注冊表中值,得到插入了幾個(gè)U盤
count, _, err := k.GetIntegerValue("Count")
// 獲取全部盤符
disks := GetSystemDisks()
return disks[len(disks)-int(count):]
}
//遞歸復(fù)制目錄
func copyDir(src string, dest string) {
src_original := src
err := filepath.Walk(src, func(src string, f os.FileInfo, err error) error {
if f == nil {
return err
}
if f.IsDir() {
// fmt.Println(f.Name())
//copyDir(f.Name(), dest+"/"+f.Name())
} else {
//fmt.Println(src)
//fmt.Println(src_original)
//fmt.Println(dest)
dest_new := strings.Replace(src, src_original, dest, -1)
//fmt.Println(dest_new)
//fmt.Println("CopyFile:" + src + " to " + dest_new)
CopyFile(src, dest_new)
}
//println(path)
return nil
})
if err != nil {
//fmt.Printf("filepath.Walk() returned %v\n", err)
}
}
// 拷貝文件
func CopyFile(src, dst string) (w int64, err error) {
srcFile, err := os.Open(src)
if err != nil {
fmt.Println(err.Error())
return
}
defer srcFile.Close()
//fmt.Println("dst:" + dst)
dst_slices := strings.Split(dst, "\\")
dst_slices_len := len(dst_slices)
dest_dir := ""
for i := 0; i < dst_slices_len-1; i++ {
dest_dir = dest_dir + dst_slices[i] + "\\"
}
//dest_dir := getParentDirectory(dst)
//fmt.Println("dest_dir:" + dest_dir)
b, err := PathExists(dest_dir)
if b == false {
err := os.Mkdir(dest_dir, os.ModePerm) //在當(dāng)前目錄下生成md目錄
if err != nil {
fmt.Println(err)
}
}
dstFile, err := os.Create(dst)
if err != nil {
fmt.Println(err.Error())
return
}
defer dstFile.Close()
return io.Copy(dstFile, srcFile)
}
func getFilelist(path string) {
err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
if f == nil {
return err
}
if f.IsDir() {
return nil
}
//println(path)
return nil
})
if err != nil {
//fmt.Printf("filepath.Walk() returned %v\n", err)
}
}
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
if len(GetUDisk()) <= 0 {
fmt.Println("沒有插入U(xiǎn)盤")
return
}
for _, v := range GetUDisk() {
fmt.Println(v + "\\")
copyDir(v + "\\",v + ":\\go_copy")
}
}問題缺點(diǎn)
上面的代碼現(xiàn)在遇到的問題是:
U盤文件太多或者太大就會出現(xiàn)電腦卡死
遞歸復(fù)制耗時(shí)比較多
以上就是go實(shí)現(xiàn)自動復(fù)制U盤的詳細(xì)內(nèi)容,更多關(guān)于go自動復(fù)制U盤的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go 中 slice 的 In 功能實(shí)現(xiàn)探索
這篇文章主要介紹了Go 中 slice 的 In 功能實(shí)現(xiàn)探索,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
在Go語言開發(fā)中實(shí)現(xiàn)高性能的分布式日志收集的方法
本文介紹了在Go語言開發(fā)中實(shí)現(xiàn)高性能分布式日志收集的關(guān)鍵步驟和考慮因素,包括日志生成與采集、日志傳輸、日志收集器的高性能網(wǎng)絡(luò)I/O、日志存儲與分析、監(jiān)控與告警系統(tǒng)、擴(kuò)展性與可維護(hù)性等方面,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-01-01
通過Golang實(shí)現(xiàn)linux命令ls命令(命令行工具構(gòu)建)
這篇文章主要為大家詳細(xì)介紹了如何通過Golang實(shí)現(xiàn)一個(gè)linux命令ls命令(命令行工具構(gòu)建),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-01-01
go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟
這篇文章主要介紹了go語言實(shí)戰(zhàn)之實(shí)現(xiàn)比特幣地址校驗(yàn)步驟,利用生產(chǎn)的隨機(jī)數(shù)采用橢圓加密算法生成公鑰,具體步驟實(shí)例代碼請參考下本文2021-05-05

