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

时间:2019-07-06 11:11:38

标签: go

我有一个名为“ myfolder”的文件夹,其中包含一些txt和jpeg文件,还有一个名为“ test”的文件夹。 我想在myfolder中复制文件以进行测试,直到达到特定大小(例如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))
}

我做错了什么,我该怎么做?

2 个答案:

答案 0 :(得分:0)

此行是错误的:

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

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

您可能要在其中复制一个文件。

尽管很难解释您的代码-我不确定为什么files根本存在,也不确定为什么要遍历两次目录结构。因此,您的目标尚不清楚,因此很难更具体。

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

答案 1 :(得分:-4)

您在多个地方错了。也许检查一下这段代码并进行比较:

package main

import (
    "errors"
    "fmt"
    "os"
    "path/filepath"
)

var (
    MyFolderPath   = "/tmp"
    DestPath       = "/tmp/dest"
    CumulativeSize int64 = 0 // in bytes
    ErrDone = errors.New("done")
)

const UpperLimit = 1024 * // 1 Kilobyte
    1024 * // 1 Megabyte
    10 // 10 Megabytes

func main() {
    err := filepath.Walk(MyFolderPath, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            fmt.Printf("problem with file (%s): %v", path, err)
            return nil
        }
        if info.IsDir() {
            return filepath.SkipDir // skip it, walk will enter it too
        }
        CumulativeSize += info.Size()

        if CumulativeSize >= UpperLimit {
            return ErrDone
        }

        // copy file here

        return nil
    })

    if err == ErrDone {
        fmt.Println("finished successfully")
    } else {
        fmt.Printf("error: %v", err)
    }
}