go语言实现文件复制、移动(cp、mv命令)
2023-12-20 16:36:14
目录
复制文件
方式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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!