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

news/2024/7/20 21:12:47 标签: xcode, golang, ios

目录

复制文件

方式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会报错,因此需要提前准备好目的目录。
 


http://www.niftyadmin.cn/n/5277866.html

相关文章

RTP/RTCP/RTSP/SIP/SDP/RTMP对比

RTP(Real-time Transport Protocol)是一种用于实时传输音频和视频数据的协议。它位于传输层和应用层之间,主要负责对媒体数据进行分包、传输和定时。 RTCP(Real-Time Control Protocol)是 RTP 的控制协议,…

k8s的API资源对象CustomResourceDefinition(CRD)

API资源对象CustomResourceDefinition(CRD)** 在Kubernetes中,像Pod、Service和Deployment这样的资源是由内置的资源类型如Pod、Service和Deployment表示的。而CustomResourceDefinition(CRD)允许你定义和创建自己的资…

深入了解 npm 命令

目录 前言1 初始化项目2 安装依赖3 更新依赖4 发布包5 卸载包6 查看依赖7 运行脚本8 包搜索9 查看包信息结语 前言 在现代 Web 开发中,JavaScript 是一种至关重要的语言,而 npm(Node Package Manager)作为 Node.js 平台的默认软件…

宝塔面板安装MySQL数据库并通过内网穿透工具实现公网远程访问

文章目录 前言1.Mysql 服务安装2.创建数据库3.安装 cpolar3.2 创建 HTTP 隧道 4.远程连接5.固定 TCP 地址5.1 保留一个固定的公网 TCP 端口地址5.2 配置固定公网 TCP 端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了 Linux 命令行进行繁琐的配置,下面简单几步,通…

Unity的UI界面——Text/Image

编辑UI界面时,要先切换到2d界面 (3d项目的话) 1.Text控件 Text控件的相关属性: Character:(字符) Font:字体 Font Style:字体样式 Font Size:字体大小 Line Spac…

create-react-app 打包去掉 map文件

前言: 在使用 create-react-app 创建的React应用中,默认情况下会生成带有.map文件的打包文件,这些.map文件包含了源代码和调试信息,用于开发和调试过程中进行错误跟踪。然而,在生产环境中,这些.map文件通常…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …

RocketMQ系统性学习-RocketMQ高级特性之消息存储在Broker的文件布局

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…