Pergunta

A função de API do Windows CopyFile tem uma BOOL bFailIfExists argumento que lhe permite controlar se deseja ou não para substituir o arquivo de destino se ele existir.

A função boost::filesystem copy_file não tem tal argumento, e falhará se o arquivo existe alvo. Existe uma maneira elegante de usar a função copy_file impulso e substituir o arquivo de destino? Ou é melhor simplesmente usar a API do Windows? Minha plataforma alvo atual é o Windows, mas eu prefiro usar STL e impulsionar, sempre que possível para manter minha plataforma de código independente.

Obrigado.

Foi útil?

Solução

Há uma terceira enum argumento para copy_file, boost :: filesystem :: copy_option :: overwrite_if_exists

copy_file(source_path,destination_path,copy_option::overwrite_if_exists);

Outras dicas

Cuidado com boost :: copy_file com copy_option :: overwrite_if_exists! Se o arquivo de destino existe e é menor do que a fonte, a função só irá substituir o primeiro tamanho (from_file) bytes no arquivo de destino.

Pelo menos para mim esta foi uma ressalva desde que eu presume copy_option :: overwrite_if_exists afeta arquivos e não conteúdo

Test se o arquivo de destino existe em primeiro lugar e, se isso acontecer, então removê-lo:

if (exists (to_fp))
    remove (to_fp);
copy_file (from_fp, to_fp);

Ou se você está preocupado com o arquivo que aparece entre o teste ea cópia então você poderia gravar em um arquivo temporário e, em seguida, renomeá-lo para o arquivo de destino.

Existe uma maneira elegante de usar a função boost copy_file e substituir o arquivo de destino?

Aparentemente não há nenhuma API direta de fazer isso.

Ou é melhor simplesmente usar a API do Windows? Minha plataforma alvo atual é o Windows, mas eu prefiro usar STL e impulsionar, sempre que possível para manter minha plataforma de código independente.

A partir da documentação:

A proposta, N1975, para incluir Boost.Filesystem no Relatório Técnico 2 foi aceito pelo Comitê de Pronunciamentos ++ a C. A biblioteca Boost.Filesystem vai ficar em alinhamento com a proposta TR2 Filesystem como ele trabalha o seu caminho através do processo TR2. Note, no entanto, que namespaces e difere cabeçalho granularidade entre Boost.Filesystem ea proposta TR2.

O que sugere fortemente que furando com boost::filesystem é uma boa idéia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top