go语言实现文件复制、移动(cp、mv命令)

发布时间:2023年12月20日

目录

复制文件

方式1:通过内置包文件操作实现

方式2:通过exec包实现

移动文件

方式1:通过内置包文件操作实现

方式2:通过exec包实现

提示


复制文件

方式1:通过内置包文件操作实现

func CopyFile(src, dst string) (size int64, err error) {
?? ?fmt.Printf("ready copy '%s' to '%s'\n", src, dst)

?? ?srcFile, err := os.OpenFile(src, os.O_RDONLY, 0644)
?? ?if err != nil {
?? ??? ?err = fmt.Errorf("failed to open source file: %v", err)
?? ??? ?return
?? ?}
?? ?defer srcFile.Close()

?? ?info, err := srcFile.Stat()
?? ?if err != nil {
?? ??? ?err = fmt.Errorf("failed to get file info: %v\n", err)
?? ??? ?return
?? ?}

?? ?size = info.Size()

?? ?if info.IsDir() {
?? ??? ?err = fmt.Errorf("source is a directory, does not support copying directories recursively.")
?? ??? ?return
?? ?}

?? ?dstFile, err := createFile(dst, info)
?? ?if err != nil {
?? ??? ?err = errors.New(fmt.Sprintf("failed to create destination file: %v", err))
?? ??? ?return
?? ?}
?? ?defer dstFile.Close()

?? ?_, err = io.Copy(dstFile, srcFile)
?? ?if err != nil {
?? ??? ?err = fmt.Errorf(fmt.Sprintf("failed to copy file: %v\n", err))
?? ??? ?return
?? ?}

?? ?fmt.Printf("successfully copied '%s' to '%s'\n", src, dst)
?? ?return
}

func createFile(dst string, info os.FileInfo) (*os.File, error) {
?? ?dir := filepath.Dir(dst)
?? ?
?? ?err := os.MkdirAll(dir, os.ModePerm)
?? ?if err != nil {
?? ??? ?return nil, fmt.Errorf("failed to create destination directory: %w", err)
?? ?}

?? ?dstFile, err := os.Create(dst)
?? ?if err != nil {
?? ??? ?return nil, fmt.Errorf("failed to create destination file: %w", err)
?? ?}

?? ?err = dstFile.Chmod(info.Mode())
?? ?if err != nil {
?? ??? ?dstFile.Close()
?? ??? ?return nil, fmt.Errorf("failed to set destination file permissions: %w", err)
?? ?}

?? ?return dstFile, nil
}

方式2:通过exec包实现

封装执行简单命令的函数:

func Exec(name string, args ...string) (outString string, err error) {
?? ?var out bytes.Buffer
?? ?var stderr bytes.Buffer

?? ?cmd := exec.Command(name, args...)
?? ?cmd.Stdout = &out
?? ?cmd.Stderr = &stderr

?? ?err = cmd.Run()
?? ?outString = out.String()
?? ?if err != nil {
?? ??? ?err = fmt.Errorf("exec failed: %v, stderr=%s. name=%s, args=%v.", err, stderr.String(), name, args)
?? ?}

?? ?return
}

使用:

_, err = Exec("cp", src, dst)

即可完成文件复制。

移动文件

方式1:通过内置包文件操作实现

func Move(src, dst string) error {
?? ?return os.Rename(src, dst)
}

方式2:通过exec包实现

_, err = Exec("mv", src, dst)

提示

目标目录不存在时,通过exec.Command的方式执行cp、mv会报错,因此需要提前准备好目的目录。
?

文章来源:https://blog.csdn.net/HYZX_9987/article/details/135110096
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。