boost::filesystem::renommer: Impossible de créer un fichier existe déjà
Je suis le renommage d'un fichier à l'aide de boost::filesystem, et parfois le fichier cible existe. Selon le coup de pouce de la documentation ici:
http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions
modèle
void rename(const Path1& from_p, const
Path2& to_p); Nécessite:
Path1::external_string_type et
Chemin2::external_string_type sont les
même type.Effets: Renomme from_p à to_p, comme si
par POSIX rename().Postconditions: !existe(from_p) &&
existe(to_p), et le contenu et
les attributs du fichier d'origine
nommé from_p sont par ailleurs inchangé.[Note: Si from_p et to_p résoudre à
le même fichier, aucune action n'est prise.
Sinon, si to_p correspond à un
fichier existant, il est supprimé. Un
lien symbolique lui-même renommé,
plutôt que le fichier il se résout à
d'être renommé. -- fin de la note]
(mon emphase)
En testant ce code compilé via MS Visual Studio 2008 sur XP SP3, le renommer jette boost::filesystem::filesystem_error avec le message:
Ne peut pas créer un fichier existe déjà
Je note ce point a été soulevé dans un rapport de bug:
https://svn.boost.org/trac/boost/ticket/2866
... mais prétend être fermé en Boost 1.41.0 et je suis d'utilisation de Boost 1.42.0.
Je fais quelque chose de mal ici ou devrais-je revenir à std::renommer?
Je n'ai pas testé sur Linux, donc ne sais pas si le problème existe aussi.
OriginalL'auteur Simon Elliott | 2010-07-01
Vous devez vous connecter pour publier un commentaire.
Dirait qu'il a été fixé, mais seulement dans le bac à sable "V3" version de Boost.Système de fichiers, ce qui n'est pas dans la canalisation principale Boost sorties encore.
Je l'ai testé sur un coup de pouce 1.43.0 sur Linux avec les mêmes résultats, en fait, le rapport de bug souligne les la délinquance code, qui stipule explicitement que vérifie l'existence sur POSIX et lève l'exception. Il est possible que cela a été fait à l'origine, car
MoveFile
sur Windows présente le même comportement? Dans le bac à sable V3 version, renommer appelleraMoveFileEx
sur Windows etstd::rename
sur POSIX, et permet d'écraser un fichier existant.Je suppose que tu peux contourner le problème en appelant
boost::filesystem::remove
sur la cible avant d'appelerboost::filesystem::rename
, selon vos besoins du programme de l'opération atomique ou pas.OriginalL'auteur bjlaub