在围棋里有没有什么简单快捷的复制文件的方法?

我在"doctor "里找不到快捷的方法,上网搜索也没有什么帮助.

推荐答案

警告:此答案主要是关于向文件添加硬链接,而不是关于复制内容.

robustefficient拷贝在概念上很简单,但实现起来并不简单,因为需要处理目标操作系统及其配置施加的大量边缘情况和系统限制.

如果您只是想复制现有文件,可以使用os.Link(srcName, dstName).这避免了在应用程序中四处移动字节,并节省了磁盘空间.对于大型文件,这将大大节省时间和空间.

但不同的操作系统对硬链接的工作方式有不同的限制.根据您的应用程序和目标系统配置,Link()个调用可能并非在所有情况下都有效.

如果您需要单一的通用、健壮且高效的复制功能,请更新Copy()以:

  1. 执行判断以确保至少某种形式的复制将成功(访问权限、目录存在等)
  2. 使用以下命令判断这两个文件是否已存在且相同 os.SameFile,如果相同则返回SUCCESS
  3. try 链接,如果成功则返回
  4. 复制字节(所有有效手段均失败),返回结果

一种优化方法是在go routine 中复制字节,这样调用者就不会阻塞字节复制.这样做会增加调用者正确处理成功/错误 case 的复杂性.

如果我两个都想要,我会有两个不同的复制功能:CopyFile(src, dst string) (error)用于块复制,CopyFileAsync(src, dst string) (chan c, error)用于将信令通道传递回异步情况下的调用方.

package main

import (
    "fmt"
    "io"
    "os"
)

// CopyFile copies a file from src to dst. If src and dst files exist, and are
// the same, then return success. Otherise, attempt to create a hard link
// between the two files. If that fail, copy the file contents from src to dst.
func CopyFile(src, dst string) (err error) {
    sfi, err := os.Stat(src)
    if err != nil {
        return
    }
    if !sfi.Mode().IsRegular() {
        // cannot copy non-regular files (e.g., directories,
        // symlinks, devices, etc.)
        return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String())
    }
    dfi, err := os.Stat(dst)
    if err != nil {
        if !os.IsNotExist(err) {
            return
        }
    } else {
        if !(dfi.Mode().IsRegular()) {
            return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String())
        }
        if os.SameFile(sfi, dfi) {
            return
        }
    }
    if err = os.Link(src, dst); err == nil {
        return
    }
    err = copyFileContents(src, dst)
    return
}

// copyFileContents copies the contents of the file named src to the file named
// by dst. The file will be created if it does not already exist. If the
// destination file exists, all it's contents will be replaced by the contents
// of the source file.
func copyFileContents(src, dst string) (err error) {
    in, err := os.Open(src)
    if err != nil {
        return
    }
    defer in.Close()
    out, err := os.Create(dst)
    if err != nil {
        return
    }
    defer func() {
        cerr := out.Close()
        if err == nil {
            err = cerr
        }
    }()
    if _, err = io.Copy(out, in); err != nil {
        return
    }
    err = out.Sync()
    return
}

func main() {
    fmt.Printf("Copying %s to %s\n", os.Args[1], os.Args[2])
    err := CopyFile(os.Args[1], os.Args[2])
    if err != nil {
        fmt.Printf("CopyFile failed %q\n", err)
    } else {
        fmt.Printf("CopyFile succeeded\n")
    }
}

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

Go在使用HTTP代理时如何处理DNS请求?

[0]Func()as";请勿比较哨兵类型

使用ciph.AEAD.Seal()查看内存使用情况

使用一元或服务器流将切片从GRPC服务器返回到客户端

Docker Compose Health Check未退出,错误为无法启动

文件路径.Abs()未在结果中提供子目录

当我有外键时,如何使用 GORM 创建数据库的新条目

如何为循环扫描的bufio scanner 设置超时?

为什么docall在singleflight中使用go panic?

在两个单独的速率受限端点之间同步请求

如何在 Go 中编写示例测试?

grpc-gateway:重定向与定义不匹配(原始文件)

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

转到文本/模板模板:如何根据模板本身的值数组判断值?

如何优雅地映射到 Go 中返回可变长度数组的方法?

如何在循环中旋转图像以便在 golang 中创建 GIF?

无法识别同步错误.使用一次