在go中复制文件夹

时间:2018-08-10 04:59:19

标签: go copy directory

是否有一种简单的方法可以复制目录? 我具有以下功能:

err = CopyDir("sourceFolder","destinationFolder")

到目前为止没有任何工作,包括github.com/cf-guardian/guardian/kernel/fileutils之类的库

要注意的一件事是,我需要保留目录结构,包括sourceFolder本身,而不仅仅是复制文件夹的所有内容。

5 个答案:

答案 0 :(得分:2)

This package似乎完全可以满足您的要求,请尝试一下。

自述文件:

err := Copy("your/source/directory", "your/destination/directory")

答案 1 :(得分:1)

一种简单而懒惰的方法是使用系统的copy命令。此示例仅适用于使用cp命令的系统(因此不适用于Windows)

func CopyDir(src, dst string) error {
    cmd := exec.Command("cp", "a")
    log.Printf("Running cp -a")
    return cmd.Run()
}

保存目录不是那么容易实现,因此可以使用系统程序。但是该解决方案并非在所有系统上都有效,因为它需要一个外部程序。我只会将其用于内部目的。

答案 2 :(得分:1)

我想出了一个相对较短的答案,该答案使用了1的{​​{1}}方法:

CombineLatestStream.list

答案 3 :(得分:0)

我相信docker实现可以看作是处理极端情况的完整解决方案: https://github.com/moby/moby/blob/8e610b2b55bfd1bfa9436ab110d311f5e8a74dcb/daemon/graphdriver/copy/copy.go

有以下优点:

  • 不支持的文件类型上升错误
  • 保留权限和所有权
  • 保留扩展属性
  • 保留时间戳

但是由于大量导入,您的微型应用程序变得非常庞大。

我尝试结合几种解决方案,但仅使用stdlib:

public function logout() {


    $this->load->helper('url');
    $this->load->library('session');

    $session_data = array(
      'data' =>  'data',
      'data' => 'data',
      'data' =>  'data',
      'data' =>  'data',
      'data' =>  'data',
      'data' => 'data',
      'data' => 'data',
      'data' => 'data',
      'data' => 'data',
      'data' =>  'data',
      'data' =>  'data',
      'data' =>  'data',
      'data' =>  'data',
      'data' =>  'data'
    );
    $this->session->set_userdata($session_data);

        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');
        $this->session->unset_userdata('data');

    $this->session->sess_destroy();
    redirect('http://localhost/dir/dir1/dir2/index.php/Controller/loginview', 'refresh');
}

答案 4 :(得分:0)

这也可能是一个解决方案:

可在 github.com/floscodes/golang-tools 上获得

import (
    "fmt"
    "io/ioutil"
    "os"
)

func CopyDir(src string, dest string) error {

    if dest[:len(src)] == src {
        return fmt.Errorf("Cannot copy a folder into the folder itself!")
    }

    f, err := os.Open(src)
    if err != nil {
        return err
    }

    file, err := f.Stat()
    if err != nil {
        return err
    }
    if !file.IsDir() {
        return fmt.Errorf("Source " + file.Name() + " is not a directory!")
    }

    err = os.Mkdir(dest, 0755)
    if err != nil {
        return err
    }

    files, err := ioutil.ReadDir(src)
    if err != nil {
        return err
    }

    for _, f := range files {

        if f.IsDir() {

            err = CopyDir(src+"/"+f.Name(), dest+"/"+f.Name())
            if err != nil {
                return err
            }

        }

        if !f.IsDir() {

            content, err := ioutil.ReadFile(src + "/" + f.Name())
            if err != nil {
                return err

            }

            err = ioutil.WriteFile(dest+"/"+f.Name(), content, 0755)
            if err != nil {
                return err

            }

        }

    }

    return nil
}