Windows 上的copy命令不支持追加写入,如何获得进度呢

hellsam · 2021-08-21 03:12:48 · 1850 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-08-21 03:12:48 的主题,其中的信息可能已经有所发展或是发生改变。

COPY没有追加写入,
当复制一个文件时候,马上模板就显示 模板字节大小了,,

根本没办法计算复制的百分比 计算

大家都如何解决的呢

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1850 次点击  
加入收藏 微博
11 回复  |  直到 2021-09-07 19:42:15
wuchenghui
wuchenghui · #1 · 4年之前

做个假的进度条

hellsam
hellsam · #2 · 4年之前
wuchenghuiwuchenghui #1 回复

做个假的进度条

算了 不用windows copy了 自己GO写个得了 也差不了多少性能

zzustu
zzustu · #3 · 4年之前

显示进度:copy /z a b

hellsam
hellsam · #4 · 4年之前
zzustuzzustu #3 回复

显示进度:`copy /z a b`

用go exec执行这个copy命令,有办法让go知道复制进度吗

zzustu
zzustu · #5 · 4年之前
hellsamhellsam #4 回复

#3楼 @zzustu 用go exec执行这个copy命令,有办法让go知道复制进度吗

你的想法很独特呀,还是用go写一个吧

hellsam
hellsam · #6 · 4年之前

@zzustu 听说这个用缓存的不错,就是能帮看看如何得到进度吗

func copyFile(srcFileName string, dstFileName string) (written int64, err error) {
    srcFile, err := os.Open(srcFileName)
    if err != nil {
        fmt.Printf("open file error = %v\n", err)
    }
    defer srcFile.Close()

    //通过srcFile,获取到READER
    reader := bufio.NewReader(srcFile)

    //打开dstFileName
    dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        fmt.Printf("open file error = %v\n", err)
        return
    }

    //通过dstFile,获取到WRITER
    writer := bufio.NewWriter(dstFile)
    //writer.Flush()

    defer dstFile.Close()

    return io.Copy(writer, reader)
}
zzustu
zzustu · #7 · 4年之前

随手写的demo, 仅供参考

func Copy(src, target string) error {
    sf, err := os.Open(src)
    if err != nil {
        return err
    }
    defer func() { _ = sf.Close() }()

    // 获取文件大小
    stat, err := sf.Stat()
    if err != nil {
        return err
    }
    size := float64(stat.Size())

    tf, err := os.OpenFile(target, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm)
    if err != nil {
        return err
    }
    defer func() { _ = tf.Close() }()

    var progress float64
    buf := make([]byte, 4096)
    for {
        n, err := sf.Read(buf)
        if err != nil {
            if errors.Is(err, io.EOF) {
                return nil
            }
            return err
        }
        if _, err = tf.Write(buf[:n]); err != nil {
            return err
        }
        progress += float64(n)

        // 拷贝一次休眠以下, 不然文件太小复制时看不到进度条效果
        time.Sleep(50*time.Millisecond)

        // 打印进度条
        printBar(progress, size)
    }
}

func printBar(progress, size float64) {
    bar := make([]byte, 102)
    p := progress/size*100

    bar[0] = '['
    for i := 1; i < 101; i++ {
        if i <= int(p) {
            bar[i] = '='
        } else {
            bar[i] = ' '
        }
    }
    bar[101] = ']'

    // 不换行输出进度条
    fmt.Printf("\r当前进度: %s %.0f/%.0f (%.2f%%)", bar, progress, size, p)
}
hellsam
hellsam · #8 · 4年之前
zzustuzzustu #7 回复

随手写的demo, 仅供参考 ```go func Copy(src, target string) error { sf, err := os.Open(src) if err != nil { return err } defer func() { _ = sf.Close() }() // 获取文件大小 stat, err := sf.Stat() if err != nil { return err } size := float64(stat.Size()) tf, err := os.OpenFile(target, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, os.ModePerm) if err != nil { return err } defer func() { _ = tf.Close() }() var progress float64 buf := make([]byte, 4096) for { n, err := sf.Read(buf) if err != nil { if errors.Is(err, io.EOF) { return nil } return err } if _, err = tf.Write(buf[:n]); err != nil { return err } progress += float64(n) // 拷贝一次休眠以下, 不然文件太小复制时看不到进度条效果 time.Sleep(50*time.Millisecond) // 打印进度条 printBar(progress, size) } } func printBar(progress, size float64) { bar := make([]byte, 102) p := progress/size*100 bar[0] = '[' for i := 1; i < 101; i++ { if i <= int(p) { bar[i] = '=' } else { bar[i] = ' ' } } bar[101] = ']' // 不换行输出进度条 fmt.Printf("\r当前进度: %s %.0f/%.0f (%.2f%%)", bar, progress, size, p) } ```

嗯好的谢谢,听别人说 用GO bufio复制占用CPU小一点 缓存模式

hellsam
hellsam · #9 · 4年之前

都是复制大文件 好几个G的

zzustu
zzustu · #10 · 4年之前

你是才学go吗?

  1. 那不是声明了 buffer
  2. 休眠是demo, 让你测试小文件时看进度条进度效果的,你不会以为这个实际中也要休眠吧

2021-09-07_17-53.png

hellsam
hellsam · #11 · 4年之前
zzustuzzustu #10 回复

你是才学go吗? 1. 那不是声明了 buffer 2. 休眠是demo, 让你测试小文件时看进度条进度效果的,你不会以为这个实际中也要休眠吧 ![2021-09-07_17-53.png](https://static.studygolang.com/210907/b9752ae4535c32a70054238f77c25113.png)

好吧 看错了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传