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;
 
}