[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:
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
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:
void MaFenetre::synchro() { QString source; source = lettreO + ":\\" + dossier + "\\"; QString destination; destination = lettreD + ":\\" + dossier + "\\"; //on crée le dossier dans le disque de destination s'il n'existe pas QDir dir; dir.mkpath(lettreD + ":\\" + dossier); //on se place dans le dossier d'origine spécifié auparavant QDir::setCurrent(source); QDir dirSource(source); //on choisit de copier tous les types de fichiers QStringList filtre; filtre << "*.*"; dirSource.setNameFilters(filtre); //on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier int nombre_de_fichiers = dirSource.count(); //stocke le nom du fichier en cours de copie QString nom_du_fichier; //On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier int i; for (i=0 ; i < nombre_de_fichiers ; i++ ) { QString sourcefile; QString destinationfile; //on récupère les noms de fichiers stockés dans le filtre et on les stocke nom_du_fichier = dirSource.entryList(filtre).at(i); if (nom_du_fichier != "." && nom_du_fichier != "..") { //on concatène les chemins source et destination avec le nom du fichier en cours pour passer a la copie sourcefile = source + nom_du_fichier; destinationfile = destination + nom_du_fichier; //affichage du chemin source concaténé avec le nom du fichier en cours de copie etat->setText("Fichier copié: " + sourcefile); // on effectue la copie de la source vers la destination QFile file(sourcefile); file.copy(destinationfile); //on effectue la copie de la destination vers la source (synchro) QFile file2(destinationfile); file2.copy(sourcefile); } } progressbar->setValue(100); }
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
Ok, j'ai donc réussi a faire cela en m'aidant sur internet, mais la copie ne s'effectue plus...Voici le code:
Une idée?
void MaFenetre::synchro()
{
QString source;
source = lettreO + ":\\" + dossier + "\\";
QString destination;
destination = lettreD + ":\\" + dossier + "\\";
//on crée le dossier dans le disque de destination s'il n'existe pas
QDir dir;
dir.mkpath(lettreD + ":\\" + dossier);
//on se place dans le dossier d'origine spécifié auparavant
QDir::setCurrent(source);
QDir dirSource(source);
//on choisit de copier tous les types de fichiers
QStringList filtre;
filtre << "*.*";
dirSource.setNameFilters(filtre);
//on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
int nombre_de_fichiers = dirSource.count();
//stocke le nom du fichier en cours de copie
QString nom_du_fichier;
//On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
int i;
// On récupère les infos des fichiers stockés dans le filtre et on les stocke
// Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
// On récupère les infos des fichiers stockés dans le filtre et on les stocke
// Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
QFileInfoList liste_des_fichiers = dirSource.entryInfoList(filtre);
// On boucle sur le nombre de fichiers du répertoire pour tout copier
for (int i=0 ; i < liste_des_fichiers.size() ; i++ )
{
// On ignore les répertoires courant et précédent
if (nom_du_fichier == "." || nom_du_fichier == "..")
continue;
QFileInfo infos_du_fichier = liste_des_fichiers.at(i);
QString nom_du_fichier = infos_du_fichier.fileName();
// On concatène les chemins source et destination avec
// le nom du fichier en cours pour passer a la copie
QString sourcefile = infos_du_fichier.absoluteFilePath();
QString destinationfile = destination + nom_du_fichier;
// On vérifie si le fichier de destination existe
QFileInfo infos_dest(destinationfile);
if (infos_dest.exists()
// et si sa date de modification est plus récente que le
// fichier source
// Edit: && (infos_dest.lastModified() > infos_dest.lastModified()))
&& (infos_dest.lastModified() > infos_du_fichier.lastModified()))
{
}
// Affichage du chemin source concaténé
// avec le nom du fichier en cours de copie
etat->setText("Fichier copié: " + sourcefile);
// on effectue la copie de la source vers la destination
QFile file(sourcefile);
file.copy(destinationfile);
}
}
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.
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:
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?
void MaFenetre::synchro()
{
QString source;
source = lineSOURCE->text() + ":\\" + lineDOSSIER->text() + "\\";
QString destination;
destination = lineDEST->text() + ":\\" + lineDOSSIER->text() + "\\";
//on crée le dossier dans le disque de destination s'il n'existe pas
QDir dir;
dir.mkpath(lineDEST->text() + ":\\" + lineDOSSIER->text());
//on se place dans le dossier d'origine spécifié auparavant
QDir::setCurrent(source);
QDir dirSource(source);
//on choisit de copier tous les types de fichiers
QStringList filtre;
filtre << "*.*";
dirSource.setNameFilters(filtre);
//on récupère le nombre de fichiers contenus dans le filtre et donc dans le dossier
int nombre_de_fichiers = dirSource.count();
//stocke le nom du fichier en cours de copie
QString nom_du_fichier;
//On boucle sur le nombre de fichiers contenus dans le répertoire pour tout copier
int i;
// On récupère les infos des fichiers stockés dans le filtre et on les stocke
// Et on fait ça à l'extérieur de la boucle (parce que c'est coûteux)
QFileInfoList liste_des_fichiers = dirSource.entryInfoList(filtre);
// On boucle sur le nombre de fichiers du répertoire pour tout copier
for (int i=0 ; i < liste_des_fichiers.size() ; i++ )
{
// On ignore les répertoires courant et précédent
if (nom_du_fichier == "." || nom_du_fichier == "..")
continue;
QFileInfo infos_du_fichier = liste_des_fichiers.at(i);
QString nom_du_fichier = infos_du_fichier.fileName();
// On concatène les chemins source et destination avec
// le nom du fichier en cours pour passer a la copie
QString sourcefile = infos_du_fichier.absoluteFilePath();
QString destinationfile = destination + nom_du_fichier;
// On vérifie si le fichier de destination existe
QFileInfo infos_dest(destinationfile);
if (infos_dest.exists())
{
if (infos_dest.lastModified() > infos_du_fichier.lastModified())
{
// si on arrive ici, le fichier de destination est plus récent que la source
continue;
}
// si on arrive ici, le fichier de destination est plus ancien on tente de l'effacer
if(!QFile::remove(destinationfile))
{
// si on arrive ici le fichier est protégé
// (en cours d'utilisation, ou droits d'accès insuffisants)
continue;
}
}
// Affichage du chemin source concaténé avec le nom du fichier en cours de copie
etat->setText("Fichier copié: " + sourcefile);
// on effectue la copie de la source vers la destination
QFile file(sourcefile);
file.copy(destinationfile);
}
}
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
- Contenus similaires :
Tags :