go - 将文件复制到文件夹中,直到达到一定大小

标签 go

我有一个名为“myfolder”的文件夹,其中包含一些 txt 和 jpeg 文件以及一个名为“test”的文件夹。 我想复制我的文件夹中的文件进行测试,直到它达到一定大小,例如10MB,然后停止复制。

这是我的代码,但不起作用:

package main

import (
    "errors"
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "strconv"
)

var (
    MyFolderPath = "/home/jim/myfolder"
    files        []string
)

func copy(source []string, destination string) {

    for a, b := range source {
        input, _ := ioutil.ReadFile(b)
        ioutil.WriteFile(destination+strconv.Itoa(a), input, 0777)
    }

}

func CopyFile(path string) {
    var size int64
    done := errors.New("size reached")
    err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        copy(files[1:], fmt.Sprintf("%v/test/%v", MyFolderPath, "file"))
        size += info.Size()

        if size > 10000 {
            return done
        }

        return err

    })
    if err != nil {
        fmt.Println(err)
    }

}

func CollectFiles() {
    err := filepath.Walk(MyFolderPath, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            fmt.Println(err)
        }
        files = append(files, path)
        return nil

    })
    if err != nil {
        fmt.Println(err)
    }
}

func main() {
    CollectFiles()
    CopyFile(fmt.Sprintf("%v/test", MyFolderPath))
}

我哪里做错了,我该如何做才是正确的?

最佳答案

这一行是错误的:

    copy(files[1:], fmt.Sprintf("%v/test/%v", MyFolderPath, "file"))

每次找到文件匹配项时,您都会告诉它(重新)复制files slice 中的每个 文件,第一个文件除外。

您可能想在那里复制一个文件。

尽管您的代码很难理解——我不确定为什么 files 存在,也不确定您为什么要遍历目录结构两次。所以你的目标不是很明确,所以很难更具体。

另请注意:您不应使用copy 作为函数名称,因为它是一个built-in。 ,因此会使您的代码难以阅读。

关于go - 将文件复制到文件夹中,直到达到一定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56913543/

相关文章:

json - 从 API 解析结构

Goland 读取每行命令输出的衬垫

go - 如何通过代码向yaml文件添加新条目

unit-testing - 如何只模拟接口(interface)的一种方法

golang mqtt 发布和订阅

mongodb - $lookup 和 $match Mongodb golang

go - 未命名指针返回值的预期标识符

go - 使用 'logrus' 包时如何去掉日志之间的空格

go - 如何处理 Go 包中嵌套的 "vendor"目录?

go - 如何从 worker 那里订购结果,就好像没有使用 worker 一样?