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)
Merci d'avance pour votre aide
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(); }
NB : le code fonctionne très bien avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define DEEP 0
Partager