Me gustaría copiar un archivo usando Go puro, emulando el comportamiento de cp -p
.
Mi función de copy
actualmente se ve así:
// 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() }
que creará dst
propiedad de quien esté ejecutando el proceso. En cambio, me gustaría mantener el propietario y los permisos de src
, es decir, lo que obtengo de:
// 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() }
pero sin tener que llamar a los comandos del sistema (para portabilidad). Todo lo que probé terminó llamando a otra cosa. ¿Es posible hacerlo en Go?
Definitivamente es posible en Go, pero no de una manera independiente del sistema (porque los diferentes núcleos del sistema operativo tienen ideas diferentes sobre qué son los "permisos" y cómo se implementan).
Considere también que la identidad utilizada por el proceso que copia el archivo puede tener permisos insuficientes para establecer permisos en el archivo de destino (por ejemplo, en Linux, un usuario no raíz no puede cambiar el grupo propietario de un archivo a un grupo del que el usuario no es propietario). un miembro de, y obviamente no puede asignar el propietario del archivo a nadie más que a ellos mismos; en otras palabras, los simples mortales no pueden transferir el látigo del propietario, solo compartir archivos dentro de sus propios "círculos" definidos por la pertenencia al grupo).
Básicamente, para hacer lo que está buscando, debe Stat
el archivo de origen y luego os.Chmod
(y os.Chown
, si es necesario) el archivo de destino después de crearlo.
También tenga en cuenta que los sistemas de archivos nativos de Linux admiten ACL POSIX en archivos, y cada archivo puede tenerlos o no.
Si incluye esto en lo que define como "permisos", es una pregunta abierta.