come eseguire boost :: filesystem copy_file con sovrascrittura
-
06-07-2019 - |
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.
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.