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

C++ Discussion :

Copier le contenu d'un fichier .bak


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut Copier le contenu d'un fichier .bak
    Bonjour à tous,

    Je travaille actuellement sur un projet visant à sauvegarder une base de données complète sur un serveur distant (SQL Server).

    Pour ce faire j'utilise la commande BACKUP DATABASE de SQL Server qui m'enregistre en local un fichier .bak.

    Anciennement on pouvait enregistrer ces backups sur des nameds pipes, mais ce n'est plus possible, donc il me faut ouvrir le fichier .bak, enregistrer son contenu, l'envoyer sur un socket, puis recréer le fichier sur le serveur distant.

    Seulement voilà, je rencontre quelques problèmes pour copier le contenu exact du fichier .bak, il contient toutes sortes de caractères, chiffres, lettres, caractères spéciaux, espaces, etc (c'est illisible pour un homme).

    N'étant pas très expérimenté en C++ j'ai suivi quelques tutos pour le traitement de fichiers, mais sa ne fonctionne pas, je me retrouve avec un fichier presque identique, mais avec une taille légèrement différente et des "f" à la fin du fichier.


    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    FILE *leFichier;
    FILE *leBackup;
    char* contenuBackup = "";
    size_t result;
    long lSize;
     
    if( fopen_s( &leFichier, "...leRépertoire/FicherDeBase.bak...", "r" ) == 0 )
    {
    	// Taille du fichier:
    	fseek(leFichier, 0, SEEK_END);
    	lSize = ftell(leFichier);
    	rewind(leFichier);
     
    	// Allouer la mémoire pour contenir tout le fichier:
    	contenuBackup = (char*) malloc (sizeof(char)*lSize);
    	if(contenuBackup == NULL)
    	{
    		cout << "Erreur Memoire" << endl;
    		exit();
    	}
     
    	// Lecture du fichier dans le buffer:
    	result = fread(contenuBackup, 1, lSize, leFichier);
     
    	// Ecritude du nouveau fichier:
    	if( fopen_s(&leBackup, "...leRépertoire/nouveauFichier.bak...", "w") == 0 )
    	{
    		result = fwrite(contenuBackup, 1, lSize, leBackup);
    	}
    	else
    		cout << "Error!" << endl;
     
    	fclose(leFichier);
    	fclose(leBackup);
    	free(contenuBackup);
    }
    else
    	cout << "Erreur pour ouvrir le fichier backup" << endl;
    Dans le tuto que j'ai récupéré, le result permet de vérifier s'il est égal à lSize et retourne une erreur s'il ne l'es pas, mais je l'ai viré c'était jamais égal (problème comparaison long & size_t?).


    Après il y a un second problème, mais il doit être plus relié au fichier .bak et à SQL Server, si j'ouvre le fichier original .bak et que je fait Ctrl-A / Ctrl+C, et que je créé un nouveau fichier .bak vierge que je colle le contenu de l'original dedans, le nouveau fichier n'est pas fonctionnel...

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    fopen_s ne semble pas être standard.

    Pourquoi ne pas utiliser fopen (voir juste open) avec les options "rb" (ouvrir le fichier en lecture binaire) et "wb" (ouvrir le fichier en écriture binaire) ?

    Tu peux aussi utiliser des fread/fwrite en boucle et sortir de la boucle dès que tu arrive en fin de fichier.

    Sinon en C++ on a l'option ios::binary pour les fstream (ofstream pour l'écriture, ifstream pour la lecture).

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Merci je vais essayer sa, j'ai utilisé fopen_s car Visual Studio me mettait un warning... Mais je vais juste l'ignorer alors

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Quel warning affichait-il? Il ne faut jamais ignorer les warning.

    Sinon, tu ne teste jamais les codes de retours de fread et fwrite.
    fread retourne le nombre d'élément lu. Il vaut mieux utiliser cette valeur pour le fwrite que la valeur lu avec ftell.

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Ok bin c'est parfait sa mache... C'était juste au niveau de l'ouverture et de l'écritude "rb" et "wb" en mode binaire.

    C'est fou je l'avais vu nul part, j'aurais du mieux potasser les options de la fonction.

    En tout cas merci à toi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/08/2007, 17h11
  2. Copier le contenu d'un fichier distant dans une variable en local
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/08/2007, 20h34
  3. Copier le contenu d'un fichier vers un autre fichier Excel
    Par mathias dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/06/2007, 14h47
  4. Copier le contenu d'un fichier word
    Par MayOL69bg dans le forum C#
    Réponses: 7
    Dernier message: 04/06/2007, 16h34
  5. Copier le contenu d'un fichier dans un autre
    Par moncef357 dans le forum Pascal
    Réponses: 20
    Dernier message: 09/05/2007, 16h02

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