Se connecter avec
S'enregistrer | Connectez-vous

[QT] Utiliser QFileInfo::lastModified ?

Dernière réponse : dans Programmation

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

Lassé par la pub ? Créez un compte
Expert Programmation

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

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?

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.

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?
Lassé par la pub ? Créez un compte
Tom's guide dans le monde