Copia de archivos simple y eficiente en Go
Copia de un archivo de manera eficiente en Go, sin recurrir a bibliotecas complejas o códigos dependientes del sistema operativo, se puede lograr utilizando una implementación sólida que maneje varios casos extremos.
Uso de enlaces duros para una duplicación rápida
A Una forma rápida de duplicar un archivo existente es utilizar la función os.Link(). Esto crea un vínculo físico entre el archivo original y el archivo de destino, convirtiéndolos esencialmente en el mismo archivo en lugar de crear una copia. Este enfoque ahorra tiempo y espacio en disco, especialmente para archivos grandes.
Manejo de diferentes restricciones del sistema
Sin embargo, los enlaces físicos vienen con restricciones según el sistema operativo y el sistema de archivos. configuraciones. Por ejemplo, algunos sistemas no permiten enlaces físicos entre archivos en diferentes sistemas de archivos o particiones.
Función de copia sólida y genérica
Para crear una función de copia genérica y sólida , sigue los siguientes pasos:
Optimización y simplicidad
Para mejorar el rendimiento, la copia de bytes se puede realizar en una rutina go separada para evitar bloquear el hilo de llamada. Sin embargo, esto agrega complejidad a la responsabilidad de la persona que llama de manejar el éxito o el fracaso.
Para una implementación más sencilla, se pueden crear dos funciones de copia separadas: CopyFile() para copia sincrónica y CopyFileAsync() para copia asincrónica, que devuelve un canal de señalización para la persona que llama.
Código de muestra
El código proporcionado demuestra una sólida función CopyFile que intenta una enlace antes de realizar una copia alternativa de bytes:
package main import ( "fmt" "io" "os" ) func CopyFile(src, dst string) (err error) { // Validate input // ... if err = os.Link(src, dst); err == nil { return } err = copyFileContents(src, dst) return } func copyFileContents(src, dst string) (err error) { // Copy file contents // ... return } func main() { // ... err := CopyFile(os.Args[1], os.Args[2]) if err != nil { // ... } }
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3