Votre question

[QT] PB copie avec QFile()

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
5 Mars 2010 15:35:17

Bonjour à tous, j'en viens à solliciter votre aide car j'ai un problème sur mon programme de synchronisation.

Je m'explique:

1) Lorsque je clique sur le bouton "Synchroniser" du programme, il est censé vérifier dans le répertoire destinataire (que l'utilisateur a saisi plus tôt) si le dossier (que l'utilisateur a également saisi auparavant) est bien présent.
Dans le cas contraire, le programme se charge de le créer.

2) Le programme se charge ensuite d'afficher le nom du fichier en cours de copie (un par un, grâce a une boucle) dans un QLabel. Vous comprendrez donc l'exemple:

Source: D:\Dossier_exemple\Fichier_exemple1.ext
PUIS
Source: D:\Dossier_exemple\Fichier_exemple2.ext

(normalement tout cela doit se passe très vite, on a à peine le temps de lire le nom des fichiers copiés.)

Seulement cela ne fonctionne pas, mise a part la vérification et la création du dossier s'il n'existe pas.

Voici mon code:

  1. #include <string>
  2. #include "MaFenetre.h"
  3.  
  4. using namespace std;
  5.  
  6. MaFenetre::MaFenetre() : QWidget()
  7. {
  8. setWindowTitle("S1kronize 1.0"); //titre de la fenetre
  9. setWindowIcon(QIcon("synchro.png")); //icone de la fenetre
  10.  
  11.  
  12. m_apropos = new QPushButton("A propos", this); //déclare le bouton a propos
  13. m_quitter = new QPushButton("Quitter", this);
  14. boutonSelect1 = new QPushButton("Lettre d'origine");
  15. boutonSelect2 = new QPushButton("Lettre de destination");
  16. boutonSelect3 = new QPushButton("Dossier à synchroniser");
  17. m_synchroniser = new QPushButton("SYNCHRONISER", this);
  18. m_synchroniser->setFont(QFont("Comic Sans MS", 10));
  19. m_synchroniser->setToolTip("Go !!!");
  20. QGridLayout *vbox1 = new QGridLayout; //déclare le GridLayout vbox1
  21. progressbar = new QProgressBar(this);
  22. progressbar->setRange(0, 100);
  23. progressbar->setValue(0);
  24. origine = new QLabel(this); //déclare le label origine
  25. destination = new QLabel(this);
  26. lbldossier = new QLabel(this);
  27. groupbox = new QGroupBox("(Information) Disques reliés: ", this); //déclare le groupbox
  28. QDirModel *modele = new QDirModel; //liste les disques
  29. QTreeView *vue = new QTreeView; //déclare le style d'affichage du QDirModel
  30. vue->setModel(modele); //insère la liste des disques dans QTreeView
  31. vbox2 = new QVBoxLayout;
  32. vbox2->addWidget(vue); //ajoute le QTreeView au layout vbox2
  33. groupbox->setLayout(vbox2); //ajoute le layout vbox2 dans le groupbox
  34. etat = new QLabel(this);
  35.  
  36. // Positionnement des widgets sur la fenetre
  37. vbox1->addWidget(boutonSelect1, 0, 0);
  38. vbox1->addWidget(origine, 0, 1);
  39. vbox1->addWidget(groupbox, 0, 2, 5, 1);
  40. vbox1->addWidget(boutonSelect2, 1, 0);
  41. vbox1->addWidget(destination, 1, 1);
  42. vbox1->addWidget(boutonSelect3, 2, 0);
  43. vbox1->addWidget(lbldossier, 2, 1);
  44. vbox1->addWidget(m_synchroniser, 3, 0, 1, 2);
  45. vbox1->addWidget(m_apropos, 4, 0);
  46. vbox1->addWidget(m_quitter, 4, 1);
  47. vbox1->addWidget(etat, 5, 0);
  48. vbox1->addWidget(progressbar, 6, 0, 1, 3);
  49.  
  50. setLayout(vbox1); //insère le layout vbox1 dans la fenetre
  51.  
  52. //connexion des boutons
  53. QObject::connect(boutonSelect1, SIGNAL(clicked()), this, SLOT(afficher1()));
  54. QObject::connect(boutonSelect2, SIGNAL(clicked()), this, SLOT(afficher2()));
  55. QObject::connect(boutonSelect3, SIGNAL(clicked()), this, SLOT(afficher3()));
  56. QObject::connect(m_quitter, SIGNAL(clicked()), this, SLOT(ouvrir()));
  57. QObject::connect(m_apropos, SIGNAL(clicked()), this, SLOT(propos()));
  58. QObject::connect(m_synchroniser, SIGNAL(clicked()), this, SLOT(synchro()));
  59. }
  60.  
  61.  
  62. void MaFenetre::ouvrir()
  63. {
  64. int reponse = QMessageBox::warning(this, "Quitter", "Voulez-vous vraiment quitter?", QMessageBox::Yes | QMessageBox::No);
  65. if (reponse == QMessageBox::Yes)
  66. {
  67. QObject::connect(m_oui, SIGNAL(clicked()), qApp, SLOT(quit()));
  68. }
  69. else if (reponse == QMessageBox::No)
  70. {
  71. }
  72. }
  73.  
  74. void MaFenetre::propos()
  75. {
  76. QMessageBox::information(this, "A propos", "S1kronize a été développé par <strong>Tib</strong> à l'aide du <a href=\"<a href="http://www.siteduzero.com" rel="nofollow" target="_blank">http://www.siteduzero.com</a>\">Site du Zéro</a>.<br /> Ce programme permet de synchroniser 2 périphériques simultanément. <br />License: aucune (Peut être librement partagé).");
  77. }
  78.  
  79. void MaFenetre::afficher1()
  80. {
  81. bool ok = false;
  82. lettreO = QInputDialog::getText(this, "Lettre de disque d'origine", "Saisir la lettre du disque d'origine (ex: D)", QLineEdit::Normal, QString(), &ok);
  83. if (ok && !lettreO.isEmpty()) //vérifie que le champ n'est pas vide
  84. {
  85. origine->setText("Elément d'origine--> " + lettreO); //attribue cette valeur au label origine
  86. select1 = lettreO.toStdString().c_str(); //converti lettreO en const char
  87. }
  88. else
  89. {
  90. QMessageBox::warning(this, "Attention", "Aucune lettre n'a été saisie!"); //si champ vide, affiche ce message
  91. }
  92. }
  93.  
  94. void MaFenetre::afficher2()
  95. {
  96. bool ok = false;
  97. lettreD = QInputDialog::getText(this, "Lettre de disque de destination", "Saisir la lettre du disque de destination (ex: F)", QLineEdit::Normal, QString(), &ok);
  98. if (ok && !lettreD.isEmpty())
  99. {
  100. destination->setText("Elément de destination--> " + lettreD);
  101. select2 = lettreD.toStdString().c_str(); //converti lettreD en const char
  102. }
  103. else
  104. {
  105. QMessageBox::warning(this, "Attention", "Aucune lettre n'a été saisie!");
  106. }
  107. }
  108.  
  109. void MaFenetre::afficher3()
  110. {
  111. bool ok = false;
  112. dossier = QInputDialog::getText(this, "Dossier", "Saisir le nom du dossier à synchroniser", QLineEdit::Normal, QString(), &ok);
  113. if (ok && !dossier.isEmpty())
  114. {
  115. lbldossier->setText("Dossier--> " + dossier);
  116. select3 = dossier.toStdString().c_str(); //converti dossier en const char
  117. }
  118. else
  119. {
  120. QMessageBox::warning(this, "Attention", "Aucun nom de dossier n'a été saisi");
  121. }
  122. }
  123.  
  124. void MaFenetre::synchro()
  125. {
  126. QString source;
  127. source = lettreO + ":\\" + dossier + ":\\";
  128. QString destination;
  129. destination = lettreD + ":\\" + dossier + ":\\";
  130.  
  131. //on crée le dossier dans le disque de destination s'il n'existe pas
  132. QDir dir;
  133. dir.mkpath(lettreD + ":\\" + dossier);
  134.  
  135. //on se place dans le dossier d'origine spécifié auparavant
  136. QDir::setCurrent(source);
  137. QDir dirSource(source);
  138.  
  139. //on choisit de copier tous les types de fichiers
  140. QStringList filtre;
  141. filtre << "*.*";
  142. dirSource.setNameFilters(filtre);
  143.  
  144. //on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
  145. int nombre_de_fichiers = dirSource.count();
  146.  
  147. //stocke le nom du fichier en cours de copie
  148. QString nom_du_fichier;
  149.  
  150. //On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
  151. int i;
  152. for (i=0 ; i < nombre_de_fichiers ; i++ )
  153. {
  154. QString sourcefile;
  155. QString destinationfile;
  156.  
  157. //on récupère les noms de fichiers stockés dans le filtre et on les stocke
  158. nom_du_fichier = dirSource.entryList(filtre).at(i);
  159. if (nom_du_fichier != "." && nom_du_fichier != "..")
  160. {
  161. //on concatène les chemins source et destination avec le nom du fichier en cours pour passer a la copie
  162. sourcefile = source + nom_du_fichier;
  163. destinationfile = destination + nom_du_fichier;
  164.  
  165. //affichage du chemin source concaténé avec le nom du fichier en cours de copie
  166. etat->setText("Source: " + sourcefile);
  167.  
  168.  
  169. // on effectue la copie
  170. QFile file(sourcefile);
  171. file.copy(destinationfile);
  172. }
  173. }
  174. progressbar->setValue(100);
  175. }


Une idée?

Merci!

Autres pages sur : copie qfile

a b L Programmation
5 Mars 2010 20:46:33

Citation :
Seulement cela ne fonctionne pas, mise a part la vérification et la création du dossier s'il n'existe pas.

Quel est le comportement si tu fais du debug ?
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS