登录
首页 >  Golang >  Go问答

如何复制保留原始权限的文件?

来源:stackoverflow

时间:2024-04-14 09:06:35 398浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《如何复制保留原始权限的文件?》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我想使用纯 go 复制文件,模拟 cp -p 的行为。

我的 copy 函数当前如下所示:

// copy creates a copy of the file located at `dst` at `src`.
func copyfile(src, dst string) error {
    in, err := os.open(src)
    if err != nil {
        return err
    }
    defer in.close()

    out, err := os.create(dst)
    if err != nil {
        return err
    }

    _, err = io.copy(out, in)
    if err != nil {
        out.close()
        return err
    }
    return out.close()
}

这将创建由运行该进程的人拥有的 dst。相反,我想保留 src 的所有者和权限,即我从中获得的内容:

// copy creates a copy of the file located at `dst` at `src`.
func copyFile(src, dst string) error {
    cmd := exec.Command("cp", "-p", src, dst)
    return cmd.Run()
}

但无需调用系统命令(为了可移植性)。我尝试过的所有事情最终都会被其他事情所吸引。这可以在 go 中实现吗?


正确答案


这在 Go 中绝对是可能的,但不是以独立于系统的方式(因为不同的操作系统内核对于什么是“权限”以及它们如何实现有不同的想法)。

还要考虑复制文件的进程使用的身份可能没有足够的权限来设置目标文件的权限(例如,在 Linux 上,非 root 用户无法将文件的所属组更改为用户不是其成员,并且显然不能将文件所有者设置为除自己之外的任何人 - 换句话说,普通人无法转让所有权,只能在由组成员身份定义的自己的“圈子”内共享文件)。

基本上,要做你想做的事,你必须 Stat 源文件,然后 os.Chmod (和 os.Chown,如果需要)创建目标文件后。

另请注意,Linux 原生文件系统支持文件上的 POSIX ACLs,并且每个文件可能有也可能没有它们。
是否将其包含在您定义的“权限”中,是一个悬而未决的问题。

终于介绍完啦!小伙伴们,这篇关于《如何复制保留原始权限的文件?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>