我有一个名为“ 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))
}
我做错了什么,我该怎么做?
答案 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)
}
}