Bonsoir,

J'ai un petit code qui fonctionne qui m'affiche les sommes MD5 de fichiers d'un répertoire.
J'ai tenté de le modifier pour faire de la récursivité dans les sous-répertoires, mais je provoque une erreur de segmentation.

Pourriez-vous m'indiquer ce qui coince ? (en utilisant le deboggeur, j'ai l'impression que ma variable "dir" reste "vide"/"inaccessible", mais je ne comprend pas bien cet outil)

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <QApplication>
#include <QTextCodec>
 
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QStandardItemModel>
#include <QTableView>
 
#include <QCryptographicHash>
#include <QByteArray>
#include <QFile>
#include <QDir>
#include <QString>
#include <QList>
 
 
// Dossier à scanner
#define DOSSIER "/home/user/test"
 
// Profondeur de la récursivité
#define DEEP 2
 
 
QString hash(QFile *fichier)
{
    // lecture du ficher dans un QByteArray
    QByteArray data = fichier->readAll();
    // calcul de la somme MD5
    QByteArray dataHash = QCryptographicHash::hash(data, QCryptographicHash::Md5);
    // conversion en QString et retour de la valeur
    return dataHash.toHex();
}
 
void traiterFichiers(QDir dossier, QStandardItemModel *model)
{
    // Création de la liste des sous-dossiers
    QDir dir(dossier);
    dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Name | QDir::Reversed);
    QFileInfoList listeDossiers = dir.entryInfoList();
 
    // boucle récursive d'exploration des sous-dossiers
    for (int i = 0; i < std::min(DEEP,listeDossiers.size()); ++i)
    {
        QDir dossier(listeDossiers.at(i).absoluteDir());
        traiterFichiers(dossier, model);
    }
 
    // génération de la liste des fichiers
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);
    QFileInfoList listeFichiers = dir.entryInfoList();
 
    // Génération du hash des fichiers
    QList<QStandardItem*> enTeteTableau;
    enTeteTableau.append(new QStandardItem("Hashing MD5"));
    enTeteTableau.append(new QStandardItem("Nom de fichier"));
    enTeteTableau.append(new QStandardItem("Taille"));
    model->appendRow(enTeteTableau);
    for (int i = 0; i < listeFichiers.size(); ++i)
    {
        QFileInfo fileInfo = listeFichiers.at(i);
        // ouverture du fichier en lecture seule
        QFile fichier(fileInfo.absoluteFilePath());
        if (fichier.open(QIODevice::ReadOnly))
        {
            QList<QStandardItem*> infoHash;
            infoHash.append(new QStandardItem(hash(&fichier)));
            infoHash.append(new QStandardItem(fileInfo.fileName()));
            infoHash.append(new QStandardItem(QString::number(fileInfo.size())+" octets"));
            model->appendRow(infoHash);
        }
        else
        {
            QList<QStandardItem*> infoHash;
            infoHash.append(new QStandardItem("Ouverture impossible"));
            infoHash.append(new QStandardItem(fileInfo.fileName()));
            model->appendRow(infoHash);
        }
    }
}
 
int main(int argc, char *argv[])
{
//    Calcul de sommes MD5 des fichiers d'un dossier
//    Sources :
//    - http://qt.developpez.com/faq/?page=fr-es#lire_fichier_texte
//    - http://www.lesite.com/tutoriel-3-295903-hacher-avec-qt.html
 
    QApplication app(argc, argv);
 
    // Codage en UTF-8
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
 
    // Affichage : création fenetre, layout, et QLabel
    QWidget fenetre;
    QVBoxLayout layout;
    QStandardItemModel *model = new QStandardItemModel(0,3);
 
    // Scan à partir de DOSSIER
    QDir dossier(QString(DOSSIER));
    traiterFichiers(dossier,model);
 
    // affichage du résultat
    layout.addWidget(new QLabel(QString(DOSSIER)));
    QTableView *vueTableau = new QTableView;
    vueTableau->setModel(model);
    layout.addWidget(vueTableau);
    fenetre.setLayout(&layout);
    fenetre.show();
 
    return app.exec();
}
Merci d'avance pour votre aide
NB : le code fonctionne très bien avec