IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

renommer un fichier pour écraser un fichier existant de même nom


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut renommer un fichier pour écraser un fichier existant de même nom
    Bonjour,

    Je dispose d'un fichier a et d'un fichier b. Je cherche à renommer a en b pour écraser b.

    Avez vous une manière élégante de le faire ? Sans lire puis réécrire a pour écraser b? J'ai fais quelques recherches sur google qui n'ont pas abouti.

    Cordialement,

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai peut etre mal compris mais pourquoi ne pas effacer b puis renommer a en b ?

    Cordialement.

  3. #3
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Bouteille Voir le message
    J'ai peut etre mal compris mais pourquoi ne pas effacer b puis renommer a en b ?
    Ce n'est plus du C alors, et donc cela devient dépendant du système d'exploitation... Il n'y a pas de fonction C standard pour renommer un fichier.

    Pas trop le choix, il faut soit passer par une fonction native de l'OS (encadrée des #ifdef / #endif adéquats), soit utiliser un appel à system().
    Dans tous les cas, je te conseille la chose suivante :
    • Crée une fonction de renommage "à toi", du genre "int frename(char* source, char* destination)".
    • Dedans, effectue des appels optimisés, via des #ifdef. Je te conseille de traiter au moins Windows et Linux comme cas principaux, n'oublie pas de rediriger la sortie vers le périphérique nul si tu fais appel à une commande externe.
    • Si aucun code optimisé n'est appliquable, alors effectue une copie C de la source vers la destination. Comme ça, au moins, ton code marchera tout le temps quoi qu'il arrive (sauf place disque insuffisante / droits, bien sûr), et sera rapide sur les plate-formes classiques.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Ce n'est plus du C alors, et donc cela devient dépendant du système d'exploitation... Il n'y a pas de fonction C standard pour renommer un fichier.
    Ce n'est pas du C mais unlink() et rename(), c'est assez indépendant de l'OS et assez courant (c'est POSIX)

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Ce n'est pas du C mais unlink() et rename(), c'est assez indépendant de l'OS et assez courant (c'est POSIX)
    Je ne crois pas qu'il existe une macro standardisée pour savoir si l'on est sur un système POSIX ou pas... En général, c'est "#ifdef _POSIX_", mais je ne sais pas si c'est standard ou même défini de façon générale.

    Et cela reste dépendant de l'OS quand même, vu qu'il doit être POSIX pour implémenter ces fonctions !

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Ce n'est plus du C alors, et donc cela devient dépendant du système d'exploitation... Il n'y a pas de fonction C standard pour renommer un fichier.
    Si, en C, il existe la fonction rename() qui permet de renommer un fichier :

    Citation Envoyé par ISO/IEC 9899-1999
    7.19.4.2 The rename function
    Synopsis
    1 #include <stdio.h>
    int rename(const char *old, const char *new);

    Description
    2 The rename function causes the file whose name is the string pointed to by old to be henceforth known by the name given by the string pointed to by new. The file named old is no longer accessible by that name. If a file named by the string pointed to by new exists prior to the call to the rename function, the behavior is implementation-defined.

    Returns
    3 The rename function returns zero if the operation succeeds, nonzero if it fails, in which case if the file existed previously it is still known by its original name.
    De même, il existe la fonction remove() pour supprimer un fichier (à utiliser de préférence à unlink.

    Ces deux fonctions existent également en C++.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Comme on est dans le forum C++ , je rappellerais que la bibliothèque Boost.File Système (tu peux trouver un tutoriel ici) permet de gérer la gestion des fichiers de façon portable. Et en l'occurrence, tu as de quoi supprimer un fichier et renommer un fichier

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par gl Voir le message
    Si, en C, il existe la fonction rename() qui permet de renommer un fichier :
    En C99 uniquement, donc ? Bon, c'est pas mal, mais ça met hors course un sacré paquet de compilateurs...

    Citation Envoyé par 3DArchi Voir le message
    je rappellerais que la bibliothèque Boost.File Système permet de gérer la gestion des fichiers de façon portable. Et en l'occurrence, tu as de quoi supprimer un fichier et renommer un fichier
    Ce qui n'est toujours pas du C/C++ "standard", et si ça ne dépend plus de l'OS, ça dépend de la présence de Boost sur la cible... Donc, si l'on veut être perfectionniste dans le code, ça ne remplace pas le fait d'utiliser des #ifdef et d'avoir, en dernier recours, une copie "manuelle" du fichier...

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    À ma connaissance, remove() et rename() sont C90 toutes les deux.

    unlink() par contre, est POSIX.

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    En C99 uniquement, donc ? Bon, c'est pas mal, mais ça met hors course un sacré paquet de compilateurs...
    En C99 c'est certain. De même qu'en C++98.

    Pour le C89/90, je n'ai pas la norme sous les yeux donc je ne pourrais le garantir avec certitude ni citer le passage. Mais vu le nombre de référence datant d'avant 99 qui cite rename() comme étant C Ansi, je pense que c'était déjà vrai en C89/90, ce qui fonctionne donc sur la plupart des compilateurs.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Merci pour toutes ces précisions, j'ai utilisé remove et rename finalement et ça passe bien sous windows (2000->7) et linux (mon appli étant cross plateforme). C'est le principal.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, remove() et rename() sont C90 toutes les deux.
    Confirme. Pour ceux qui veulent avoir exactement C90, http://www.bourguet.org/v2/clang/libc90/, dans http://www.bourguet.org/v2/clang/libc95/ je suis en train d'ajouter pour C95, mais ce n'est pas encore complet (et la date du dernier update indique avec quelle vitesse je progresse).

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/02/2013, 10h57
  2. Réponses: 1
    Dernier message: 28/07/2011, 20h05
  3. Query pour édition de fichier et création de fichier
    Par AAWOOPY56 dans le forum AS/400
    Réponses: 7
    Dernier message: 15/09/2009, 15h05
  4. [POO] script pour remplacer un fichier image par un fichier flash
    Par tomguiss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/12/2008, 14h03
  5. Ajouter une ligne en fin de fichier sans écraser le fichier
    Par Premium dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 05/04/2007, 14h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo