go实现自动复制U盘小工具demo

 更新时间:2023年12月25日 10:56:10   作者:南丞 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盘的资料请关注脚本之家其它相关文章!

相关文章

  • 解析go语言调用约定多返回值实现原理

    解析go语言调用约定多返回值实现原理

    这篇文章主要为大家介绍了解析go语言调用约定多返回值实现原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 解决Go gorm踩过的坑

    解决Go gorm踩过的坑

    这篇文章主要介绍了解决Go gorm踩过的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go 语言中控制协程数量的常用方法小结

    Go 语言中控制协程数量的常用方法小结

    本文介绍了Go语言中四种控制协程数量的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • 一文了解Go语言io.Copy函数

    一文了解Go语言io.Copy函数

    这篇文章主要为大家介绍了Go语言io.Copy函数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Golang如何将上传的文件压缩成zip(小案例)

    Golang如何将上传的文件压缩成zip(小案例)

    这篇文章主要介绍了Golang如何将上传的文件压缩成zip(小案例),这是一个简单的golang压缩文件小案例,可做很多的拓展,这里使用的库是archive/zip,在gopkg里面搜zip就行,需要的朋友可以参考下
    2024-01-01
  • 详解Go语言中如何通过Goroutine实现高并发

    详解Go语言中如何通过Goroutine实现高并发

    在Go语言中,并发编程是一个核心且强大的特性,Go语言通过goroutine和channel等机制,使得并发编程变得更加简单和直观,本文给大家介绍了Go语言中如何通过Goroutine快速实现高并发,感兴趣的小伙伴跟着小编一起来看看吧
    2024-10-10
  • 浅析golang的依赖注入

    浅析golang的依赖注入

    这篇文章主要介绍了浅析golang的依赖注入,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 使用Go语言开发短链接服务的方法

    使用Go语言开发短链接服务的方法

    短链接一般是通过映射关系,将长长的一串网址,映射到几个字符的短链接上,建立好这种映射关系之后保存到数据库里,用户每次访问短链接的时候,这篇文章主要介绍了使用Go语言开发一个短链接服务,需要的朋友可以参考下
    2024-03-03
  • Golang中互斥锁和读写互斥锁原理及示例代码

    Golang中互斥锁和读写互斥锁原理及示例代码

    在Golang中,互斥锁是一种基本的同步原语,用于实现对共享资源的互斥访问,读写互斥锁是一种特殊类型的互斥锁,它允许多个协程同时读取某个共享资源,本文将通过过示例代码详细介绍Golang中互斥锁和读写互斥锁,需要的朋友可以参考下
    2023-05-05
  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)

    golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)

    在项目开发过程中,当操作一些用户的隐私信息,本文主要主要介绍了golang常用加密解密算法总结(AES、DES、RSA、Sha1MD5),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论