Bonjour à tous,
Tout d'abord je vous explique mon projet:
Mon but est de lister une arborescence (fait) puis ensuite de choisir un fichier aléatoire dans cette arborescence (fait) puis de modifier ce fichier en rajoutant à l'intérieur un binaire n'importe où (fait).
Mon but est ensuite de choisir au lancement du programme, un taux de modification de l'arborescence, et ensuite le modifier les fichiers (avec un taux de 1/100 de modification par fichier) jusqu'à ce que mon arborescence est le taux de modification choisi.
Le problème est que c'est extrêmement long (plus de 9h pour une arborescence de 60Go environ(3Go à rajouter pour un taux de 5%)).
Je dois insérer le binaire n'importe où dans mon code, voici comment je procède. (j'utilise fstream).
Pour commencer je choisi mon l'emplacement où je vais rajouter mon binaire aléatoirement (rand)
Fichier d'origine = X
Nouveau fichier = Y
Ensuite je copie tout le début de mon fichier(X) jusqu'à l'emplacement dans un second fichier(Y) (j'explique après pourquoi je fais comme ca) puis je rajoute mon binaire dans Y et ensuite je rajoute à la suite de mon binaire le reste du fichier X dans le nouveau fichier Y. Ensuite je supprime le fichier d'origine (X) et renomme le nouveau fichier (Y) en (X) pour remplacer le fichier d'origine(X).
Je procède de la sorte étant donné que si je rajoute mon binaire directement dans le fichier d'origine, cela va me supprimer la suite, où du moins me supprimer une partie de mon fichier (je me trompe peut être mais c'est ce que j'ai aperçu en essayant). J'ai essayer faire en sorte de sauvegarder la suite de mon fichier dans une variable pour ensuite la rajouter a la suite de mon binaire dans le même fichier mais j'avais des problème avec les gros fichiers (36Go) qui dépassaient la taille du buffer.
Pour un fichier de 1Go seul, la modification prend environ 40s
Pour les petits fichiers c'est très rapide. (mais 1% par petit fichier c'est très peu donc ca met quand même énormément de temps pour remplir les 3Go total de modification)
Voila, j'aimerais avoir votre avis sur comment je pourrais améliorer cela, ou modifier certaines choses.
Merci d'avance pour votre aide.
PS: ceci est mon premier programme en c++ donc je suis près a prendre les critiques constructives.
Voici le code pour la modif d'un fichier:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 void modifFic(istream& monFlux, off_t tailleAjout, const string& cheminFic){ string extension="copietemp"; char caractere; off_t lengthF,n; unsigned int tailleRandom = 10000000; //Segmentation fault et bus error au dessus de 10m string newFic = cheminFic + extension; lengthF = tailleFic(monFlux); monFlux.clear(); // on remet les 4 flags de fstream a leur etat d'origine monFlux.seekg(0, ios::beg); // on se replace au début //On choisit l'endroit où placer notre binaire if(lengthF != 0) n=rand()%lengthF; else n=0; ofstream newFluxCopie (newFic.c_str(), ios::out | ios::ate | ios::binary); if(newFluxCopie){ //On copie tout ce qu'il y a jusqu'à n dans notre nouveau fichier int i=0; string ligne; do{ getline(monFlux,ligne); newFluxCopie << ligne << endl; i+=ligne.size(); }while(i<n && !monFlux.eof()); monFlux.clear(); monFlux.seekg(n,ios::beg); newFluxCopie.seekp(n,ios::beg); //On ajoute le binaire do{ if(tailleRandom > tailleAjout) tailleRandom = tailleAjout; char block[tailleRandom]; ifstream urandom("/dev/urandom", ios::in|ios::binary); if(urandom) urandom.read(block,tailleRandom); else cerr << "Erreur: Impossible d'ouvrir /dev/urandom" << endl; for(off_t i=0;i<tailleRandom;i++){ newFluxCopie.write((char*)&block[i],sizeof(char)); } tailleAjout -= tailleRandom; }while(tailleAjout != 0); //on rajoute la fin de la ligne pour pouvoir inserer ligne par par ligne ensuite do{ monFlux.get(caractere); newFluxCopie << caractere; }while(caractere != '\n' && !monFlux.eof()); //On remet la fin de notre premier fichier à partir de n dans notre nouveau while(getline(monFlux,ligne)){ newFluxCopie << ligne << endl; } newFluxCopie.close(); }else{ cerr << "Erreur: Impossible d'ouvrir" << newFic << endl; } fstream ficLog("resultModif.log", ios::out | ios::app); if(ficLog){ int rtrmv = remove(cheminFic.c_str()); if(rtrmv != 0){ cerr << "Erreur lors de la suppression de " << cheminFic << endl; ficLog << "Erreur lors de la suppression de " << cheminFic << endl; }else{ int rtrnm = rename(newFic.c_str(),cheminFic.c_str()); if(rtrnm != 0){ cerr << "Erreur lors du renommage de " << newFic << endl; ficLog << "Erreur lors du renommage de " << newFic << endl; } } ficLog.close(); }else cerr << "ERREUR: Impossible d'ouvrir Resultmodif.log" << endl; }
Partager