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 :
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?).
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;
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...
Partager