go实现自动复制U盘小工具demo
作者:南丞 PFinalClub
这篇文章主要为大家介绍了go实现自动复制U盘小工具demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
自动复制U盘小工具
最近在折腾 golang 写了一个 关于 电脑 插入U盘后会自动复制U盘中的内容的 小工具, 但是 技术有限,出现了一下问题,放出代码听听大家的意见
代码如下
package main import ( "io" "strings" "os" "path/filepath" "fmt" "strconv" "syscall" "golang.org/x/sys/windows/registry" ) // 获取插入的U盘盘符 func GetUDisk() []string { //查询注册表,判断是否插入U盘 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() // 获取注册表中值,得到插入了几个U盘 count, _, err := k.GetIntegerValue("Count") // 获取全部盘符 disks := GetSystemDisks() return disks[len(disks)-int(count):] } //递归复制目录 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) //在当前目录下生成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盘") return } for _, v := range GetUDisk() { fmt.Println(v + "\\") copyDir(v + "\\",v + ":\\go_copy") } }
问题缺点
上面的代码现在遇到的问题是:
U盘文件太多或者太大就会出现电脑卡死
递归复制耗时比较多
以上就是go实现自动复制U盘的详细内容,更多关于go自动复制U盘的资料请关注脚本之家其它相关文章!