"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como copiar arquivos de maneira eficiente e simples em movimento?

Como copiar arquivos de maneira eficiente e simples em movimento?

Publicado em 19/11/2024
Navegar:923

How to Copy Files Efficiently and Simply in Go?

Cópia de arquivo simples e eficiente em Go

Copiar um arquivo de forma eficiente em Go, sem recorrer a bibliotecas complexas ou código dependente do sistema operacional, pode ser alcançado usando uma implementação robusta que lida com vários casos extremos.

Usando hard links para duplicação rápida

Uma maneira rápida de duplicar um arquivo existente é usar o sistema operacional Função .Link(). Isso cria um link físico entre o arquivo original e o arquivo de destino, essencialmente tornando-os o mesmo arquivo em vez de criar uma cópia. Essa abordagem economiza tempo e espaço em disco, especialmente para arquivos grandes.

Lidando com diferentes restrições do sistema

No entanto, links físicos vêm com restrições dependendo do sistema operacional e do sistema de arquivos configurações. Por exemplo, alguns sistemas não permitem links físicos entre arquivos em diferentes sistemas de arquivos ou partições.

Função de cópia robusta e genérica

Para criar uma função de cópia genérica e robusta , execute as seguintes etapas:

  1. Verifique se há permissões, existência de diretório e outros possíveis problemas antes de tentar uma cópia.
  2. Verifique se ambos os arquivos existem e são idênticos usando os.SameFile. Se estiverem, retorne sucesso.
  3. Tente um link físico com os.Link. Retorne se for bem-sucedido.
  4. Se tudo mais falhar, copie o arquivo byte por byte.

Otimização e simplicidade

Para melhorar o desempenho, a cópia de bytes pode ser executada em uma rotina go separada para evitar o bloqueio do thread de chamada. No entanto, isso adiciona complexidade à responsabilidade do chamador de lidar com o sucesso ou a falha.

Para uma implementação mais fácil, pode-se criar duas funções de cópia separadas: CopyFile() para cópia síncrona e CopyFileAsync() para cópia assíncrona, que retorna um canal de sinalização para o chamador.

Código de exemplo

O código fornecido demonstra uma função CopyFile robusta que tenta um link físico antes de executar um fallback de cópia de byte:

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 {
        // ...
    }
}
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3