Domanda

La funzione API di Windows CopyFile ha un argomento BOOL bFailIfExists che consente di controllare se si desidera sovrascrivere o meno il file di destinazione se esiste.

La funzione boost :: filesystem copy_file non ha questo argomento e fallirà se esiste il file di destinazione. Esiste un modo elegante per utilizzare la funzione boost copy_file e sovrascrivere il file di destinazione? O è meglio semplicemente usare l'API di Windows? La mia attuale piattaforma di destinazione è Windows, ma preferisco usare STL e potenziare laddove possibile per mantenere indipendente la mia piattaforma di codice.

Grazie.

È stato utile?

Soluzione

C'è un terzo argomento enum da copiare_file, boost::filesystem::copy_option::overwrite_if_exists

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

Altri suggerimenti

Attenzione al boost :: copy_file con copy_option :: overwrite_if_exists! Se il file di destinazione esiste ed è più piccolo dell'origine, la funzione sovrascriverà solo i byte della prima dimensione (from_file) nel file di destinazione.

Almeno per me questo è stato un avvertimento da quando ho presunto che copy_option :: overwrite_if_exists influenza file e non contenuto

Verifica se il file di destinazione esiste prima e quindi lo rimuove:

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

O se sei preoccupato per il file che appare tra il test e la copia, puoi scrivere in un file temporaneo e rinominarlo nel file di destinazione.

  

Esiste un modo elegante per utilizzare la funzione boost copy_file e sovrascrivere il file di destinazione?

Apparentemente non esiste un'API diretta per farlo.

  

O è meglio semplicemente usare l'API di Windows? La mia attuale piattaforma di destinazione è Windows, ma preferisco usare STL e potenziare laddove possibile per mantenere indipendente la mia piattaforma di codice.

Dalla documentazione:

  

Una proposta, N1975, per includere Boost.Filesystem nel Rapporto tecnico 2 è stata accettata dal Comitato Standards C ++. La libreria Boost.Filesystem rimarrà in linea con la proposta del filesystem TR2 mentre si fa strada attraverso il processo TR2. Si noti, tuttavia, che gli spazi dei nomi e la granularità dell'intestazione differiscono tra Boost.Filesystem e la proposta TR2.

Il che suggerisce fortemente che attenersi a boost :: filesystem sia una buona idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top