Votre question

[QT] Utiliser QFileInfo::lastModified ?

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
13 Avril 2010 23:16:09

Bonjour à tous,

je suis actuellement sur une 2eme version d'un programme de synchronisation et j'aimerai qu'un fichier soit copié uniquement s'il a été modifié.
Pour cela, j'ai trouvé la fonction QFileInfo::lastModified, mais je ne sais pas comment l'utiliser. Voici le code de la fonction pour synchroniser:

  1. void MaFenetre::synchro()
  2. {
  3. QString source;
  4. source = lettreO + ":\\" + dossier + "\\";
  5. QString destination;
  6. destination = lettreD + ":\\" + dossier + "\\";
  7.  
  8. //on crée le dossier dans le disque de destination s'il n'existe pas
  9. QDir dir;
  10. dir.mkpath(lettreD + ":\\" + dossier);
  11.  
  12. //on se place dans le dossier d'origine spécifié auparavant
  13. QDir::setCurrent(source);
  14. QDir dirSource(source);
  15.  
  16. //on choisit de copier tous les types de fichiers
  17. QStringList filtre;
  18. filtre << "*.*";
  19. dirSource.setNameFilters(filtre);
  20.  
  21. //on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
  22. int nombre_de_fichiers = dirSource.count();
  23.  
  24. //stocke le nom du fichier en cours de copie
  25. QString nom_du_fichier;
  26.  
  27. //On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
  28. int i;
  29. for (i=0 ; i < nombre_de_fichiers ; i++ )
  30. {
  31. QString sourcefile;
  32. QString destinationfile;
  33.  
  34. //on récupère les noms de fichiers stockés dans le filtre et on les stocke
  35. nom_du_fichier = dirSource.entryList(filtre).at(i);
  36. if (nom_du_fichier != "." && nom_du_fichier != "..")
  37. {
  38. //on concatène les chemins source et destination avec le nom du fichier en cours pour passer a la copie
  39. sourcefile = source + nom_du_fichier;
  40. destinationfile = destination + nom_du_fichier;
  41.  
  42. //affichage du chemin source concaténé avec le nom du fichier en cours de copie
  43. etat->setText("Fichier copié: " + sourcefile);
  44.  
  45. // on effectue la copie de la source vers la destination
  46. QFile file(sourcefile);
  47. file.copy(destinationfile);
  48.  
  49. //on effectue la copie de la destination vers la source (synchro)
  50. QFile file2(destinationfile);
  51. file2.copy(sourcefile);
  52. }
  53. }
  54. progressbar->setValue(100);
  55. }


Aussi, j'ai l'impression que la copie de destination vers la source ne s'effectue pas...

Pourriez vous m'éclairer la dessus?

Merci d'avance!!

Tib

Autres pages sur : utiliser qfileinfo lastmodified

a b L Programmation
14 Avril 2010 21:18:47

J'ai regardé la doc, QFileInfo::lastModified te retourne un QDateTime.
Les opérateurs <, >, <=, >=, ==, != ont été redéfinis dans cette classe, donc il te suffit de comparer directement les objets: date1 != date2
m
0
l
14 Avril 2010 22:50:44

Merci de ta réponse !

Donc, si je comprend bien, j'utilise le QFileInfo::lastModified et avant la ligne
# QFile file(sourcefile);
# file.copy(destinationfile);

je met un IF date1 != date2 un truc du genre ?
m
0
l
Contenus similaires
a b L Programmation
15 Avril 2010 20:28:42

Oui
m
0
l
17 Avril 2010 13:20:10

Ok, j'ai donc réussi a faire cela en m'aidant sur internet, mais la copie ne s'effectue plus...Voici le code:

  1. void MaFenetre::synchro()
  2. {
  3. QString source;
  4. source = lettreO + ":\\" + dossier + "\\";
  5. QString destination;
  6. destination = lettreD + ":\\" + dossier + "\\";
  7.  
  8. //on crée le dossier dans le disque de destination s'il n'existe pas
  9. QDir dir;
  10. dir.mkpath(lettreD + ":\\" + dossier);
  11.  
  12. //on se place dans le dossier d'origine spécifié auparavant
  13. QDir::setCurrent(source);
  14. QDir dirSource(source);
  15.  
  16. //on choisit de copier tous les types de fichiers
  17. QStringList filtre;
  18. filtre << "*.*";
  19. dirSource.setNameFilters(filtre);
  20.  
  21. //on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
  22. int nombre_de_fichiers = dirSource.count();
  23.  
  24. //stocke le nom du fichier en cours de copie
  25. QString nom_du_fichier;
  26.  
  27. //On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
  28. int i;
  29.  
  30. // On récupère les infos des fichiers stockés dans le filtre et on les stocke
  31. // Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
  32. // On récupère les infos des fichiers stockés dans le filtre et on les stocke
  33. // Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
  34. QFileInfoList liste_des_fichiers = dirSource.entryInfoList(filtre);
  35.  
  36. // On boucle sur le nombre de fichiers du répertoire pour tout copier
  37. for (int i=0 ; i < liste_des_fichiers.size() ; i++ )
  38. {
  39. // On ignore les répertoires courant et précédent
  40. if (nom_du_fichier == "." || nom_du_fichier == "..")
  41. continue;
  42.  
  43. QFileInfo infos_du_fichier = liste_des_fichiers.at(i);
  44. QString nom_du_fichier = infos_du_fichier.fileName();
  45.  
  46. // On concatène les chemins source et destination avec
  47. // le nom du fichier en cours pour passer a la copie
  48. QString sourcefile = infos_du_fichier.absoluteFilePath();
  49. QString destinationfile = destination + nom_du_fichier;
  50.  
  51. // On vérifie si le fichier de destination existe
  52. QFileInfo infos_dest(destinationfile);
  53. if (infos_dest.exists()
  54. // et si sa date de modification est plus récente que le
  55. // fichier source
  56. // Edit: && (infos_dest.lastModified() > infos_dest.lastModified()))
  57. && (infos_dest.lastModified() > infos_du_fichier.lastModified()))
  58. {
  59.  
  60. }
  61.  
  62. // Affichage du chemin source concaténé
  63. // avec le nom du fichier en cours de copie
  64. etat->setText("Fichier copié: " + sourcefile);
  65.  
  66. // on effectue la copie de la source vers la destination
  67. QFile file(sourcefile);
  68. file.copy(destinationfile);
  69. }
  70. }


Une idée?
m
0
l
a b L Programmation
17 Avril 2010 15:51:34

Ton if ne sert à rien, donc ça ne devrait rien changer. ton setText() après le if, fonctionne?
m
0
l
17 Avril 2010 16:03:49

Le setText() fonctionne en effet
m
0
l
a b L Programmation
17 Avril 2010 19:18:23

Donc la copy source > destination devrait aussi fonctionner.
m
0
l
17 Avril 2010 20:24:01

Exact, la copie fonctionne. Seulement, il me copie tous les fichiers du dossier source, meme ceux qui sont identiques au fichier dans le répertoire de destination...

Une idée?
m
0
l
a b L Programmation
17 Avril 2010 20:46:31

Et quelles sont les 2 dates retournées ?
m
0
l
17 Avril 2010 21:12:41

Je me corrige... J'utilise pour mes test le dossier IPOD. il y a 3 fichiers dedans dont 2 fichiers .txt (je modifie un des 2 .txt dans le répertoire source pour les tests).
Mettons que les 3 fichiers soient présents sur le répertoire de destination également.

Je modifie le fichier test.txt de la source en ajoutant une ligne par exemple. Je teste le programme, et la il m'écrit le nom de ce fichier dans le setText(). Jusque la aucun souci.
Ensuite, je vais dans mon répertoire de destination, et constate que le fichier test.txt n'a pas été modifié, mais que la date d'accès est la meme que sur celui de répertoire source.

Sur les autres fichiers du dossier destination, la date d'accès n'a pas changé, elle est antérieure.

m
0
l
a b L Programmation
18 Avril 2010 11:42:37

Fait attention qu'il y a plusieurs types de date, c'est pour ça qu'il faut voir ce que ton programme compare exactement (en affichant les valeur des dates).
m
0
l
29 Avril 2010 14:51:13

Ca a rudement avancé!! voici désormais mon code (j'ai changé l'aspect du programme, a la place des boutons j'ai mis des QLineEdit, mais ca n'a pas d'incidence sur la suite:

  1. void MaFenetre::synchro()
  2. {
  3. QString source;
  4. source = lineSOURCE->text() + ":\\" + lineDOSSIER->text() + "\\";
  5. QString destination;
  6. destination = lineDEST->text() + ":\\" + lineDOSSIER->text() + "\\";
  7.  
  8. //on crée le dossier dans le disque de destination s'il n'existe pas
  9. QDir dir;
  10. dir.mkpath(lineDEST->text() + ":\\" + lineDOSSIER->text());
  11.  
  12. //on se place dans le dossier d'origine spécifié auparavant
  13. QDir::setCurrent(source);
  14. QDir dirSource(source);
  15.  
  16. //on choisit de copier tous les types de fichiers
  17. QStringList filtre;
  18. filtre << "*.*";
  19. dirSource.setNameFilters(filtre);
  20.  
  21. //on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
  22. int nombre_de_fichiers = dirSource.count();
  23.  
  24. //stocke le nom du fichier en cours de copie
  25. QString nom_du_fichier;
  26.  
  27. //On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
  28. int i;
  29.  
  30. // On récupère les infos des fichiers stockés dans le filtre et on les stocke
  31. // Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
  32.  
  33. QFileInfoList liste_des_fichiers = dirSource.entryInfoList(filtre);
  34.  
  35. // On boucle sur le nombre de fichiers du répertoire pour tout copier
  36. for (int i=0 ; i < liste_des_fichiers.size() ; i++ )
  37. {
  38. // On ignore les répertoires courant et précédent
  39. if (nom_du_fichier == "." || nom_du_fichier == "..")
  40. continue;
  41.  
  42. QFileInfo infos_du_fichier = liste_des_fichiers.at(i);
  43. QString nom_du_fichier = infos_du_fichier.fileName();
  44.  
  45. // On concatène les chemins source et destination avec
  46. // le nom du fichier en cours pour passer a la copie
  47. QString sourcefile = infos_du_fichier.absoluteFilePath();
  48. QString destinationfile = destination + nom_du_fichier;
  49.  
  50. // On vérifie si le fichier de destination existe
  51. QFileInfo infos_dest(destinationfile);
  52. if (infos_dest.exists())
  53. {
  54. if (infos_dest.lastModified() > infos_du_fichier.lastModified())
  55. {
  56. // si on arrive ici, le fichier de destination est plus récent que la source
  57. continue;
  58. }
  59.  
  60. // si on arrive ici, le fichier de destination est plus ancien on tente de l'effacer
  61. if(!QFile::remove(destinationfile))
  62. {
  63. // si on arrive ici le fichier est protégé
  64. // (en cours d'utilisation, ou droits d'accès insuffisants)
  65. continue;
  66. }
  67. }
  68.  
  69. // Affichage du chemin source concaténé avec le nom du fichier en cours de copie
  70. etat->setText("Fichier copié: " + sourcefile);
  71.  
  72. // on effectue la copie de la source vers la destination
  73. QFile file(sourcefile);
  74. file.copy(destinationfile);
  75. }
  76. }


Dans mes tests, je modifie 2 fichier .txt sur le répertoire source.
<souligne>Voici les erreurs: </souligne>

- il faut appuyer 2 fois sur le bouton 'Synchroniser' pour que les 2 fichiers soient copiés.

- le nom du fichier en cours de copie n'est pas le bon puisqu'il m'indique qu'il copie un fichier que je n'ai pas modifié (à savoir un .exe)

Sinon, la copie s'effectue correctement (le fichier de destination qui correspond au fichier source que j'ai modifié est bien modifié :)  )

Une idée?
m
0
l
a b L Programmation
29 Avril 2010 21:01:12

Corrige ton indentation, c'est pas très lisible.
m
0
l
29 Avril 2010 21:31:24

Pardon, c'est vrai que c'est difficile de lire, voila
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