IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Comparer deux fichiers


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 31
    Par défaut Comparer deux fichiers
    Bonjour à tous
    Je vais essayer d'être le plus clair possible
    En fait j'essaie de comparer les dates de modification de deux fichiers pour ensuite enregistrer seulement ceux qui ont été modifiés.
    J'utilise un fonction qui me permet d'enregistrer mais je n'arrive pas à faire la fonction récursive qui ma permettrait de lister et de comparer tous les fichiers d'un dossier en sachant qu'il peut contenir des sous répertoires qui contiendraient eux aussi des fichiers ...
    En espérant avoir été comprit
    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Par défaut
    Pour récupérer la date de modification d'un fichier, tu peux regarder du coté de la FAQ

    ici:

    http://delphi.developpez.com/faq/?pa...r#datesfichier

    Par contre pour la comparaison des fichiers de ton dossier, tu veux les comparer avec quoi ? Un autre dossier ?

    A+

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Pour la fonction qui génère la liste des fichiers, un FindFirst, FindNext s'impose, et il fourni les date je crois en plus dans son FIND_DATA ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 31
    Par défaut
    Tout d'abord merci d'avoir répondu
    Oui en fait j'aimerai les comparer a un autre dossier pour sauvegarder les modifications et seulement les modifications c'est pour cela que je doit comparer les dates de modifications j'ai essayé avec findfirst et findnext mais j'ai du mal avec la fonction récursive

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Par défaut
    Voici un axe de recherche que tu peux utiliser pour comparer deux répertoires.

    1) Effectuer un inventaire des tes 2 répertoires (Nom de fichier complet + Date de modification)

    http://delphi.developpez.com/sources...no40source0042

    2) Identifier les fichiers identiques (Surement le + grand nombre) et les sortir des inventaires

    3) Sur les inventaires réduits, Identifier et sortir les fichiers seulement présent dans le premier inventaire. (Ce sont les fichiers supprimés entre le premier et le deuxième inventaire)

    4) Sur les inventaires réduits, Identifier et sortir les fichiers seulement présent dans le deuxième inventaire. (Ce sont les nouveaux fichiers)

    5) Il te reste maintenant plus que les fichiers présent dans les deux inventaires et avec une date de modification différente.


    A+

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Complements sur les diverses pistes proposées :

    Gestion des inventaires
    Pour faire simple : 2 TStringList, un pour les fichiers locaux, un pour les fichiers distants.
    Les listes seront remplie par les noms de fichier contenant les chemins relatifs par rapport au repertoire "root" designé.
    Comparer 2 fichier revient a parcourir tous les elements d'une liste et de rechercher la presence de cette meme chaine dans la 2e (IndexOf)
    Si elle existe => Comparaison des fichier
    Sinon => Suppression ou ajout du fichier selon qu'il manque sur le repertoire distant ou local.
    Pour eviter de se melanger les pinceau, on parcours la liste locale, et on supprime de la liste distante toutes les entrees traitees.
    Cette boucle traite dont tous les fichiers locaux differents de la liste distante ou non present.
    Pour traiter les fichier present sur la liste distante et non dans la liste locale, on effectue une 2e boucle apres la precedente sur la liste distante qui ne contient (apres suppression des entrees traitee) seulement les entree non traitees donc non presente dans la liste locale.
    On met traite donc ce fichiers comme il le faut.

    [Note] Pour traiter plusieurs repertoires separes, il faut repeter cette operation pour chacun d'entre eux.

    Creation des listes
    Pour creer les listes, une fonction recursive du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Procedure Scan(rootDir, SubDir : String);
    est utile.
    RootDir est le repertoire racine, SubDir le sous repertoire depuis la racine.
    Dans le corps de cette fonction on fait des FinFirst, FindNext et un find close avant de sortir de la procedure.
    FindFirst s'applique sur RootDir+SubDir.
    Tant que l'on trouve des fichiers, on effectue pour chacun d'eux un test : Si l'attribut est "faDirectory" alors on lance un appel reccursif sur cette fonction avec comme parametres : RootDir et SubDir+<NomFichier Repertoire.
    De cette facon on construit etapes apres etapes les chemins relatinfs depuis la racine.
    Attention a tester en plus de l'attribut, le nom du repertoire, car sous DOS (et don Windows) il existe 2 reperoire qui sont retourné en debut de recherche : "." et "..".
    Lancer une recursivite sur le repertoire "." qui est un pointeur sur le repertoire courrant genere un debordement de pile : On scan le repertoire de base qui retourne . on rentre dans ce reperoire (car attribut "repertoire") et on scanne ce repertoire. le Repertoire "." etant celui dans lequel on est, on bouble indefiniement sur le meme reperoire.
    '..' lui pointe sur le repertoire supperieur, donc si on l'oublie, on remonte de reperotires en repertoire jusqu'a obtenir une violation d'acces car il n'y existe aucun repertoire supperieur a la lettre de lecteur.
    Au final, il faut donc tester si l'attribut est egal a faDirectory, puis si le nom du fichier (repertoire) est different ed "." et ".." et dans ce cas lancer la recursivité.

    Sinon, si le fichier n'est pas un repertoire, alors ajouter la concatenation subdir+Filename dans la liste adequate.

    [Note] Pour tester l'attribu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (SearchRec.attr and faDirectory) = faDirectory Then
    Car depuis XP il me semble, les repertoires sont accompagné d'autres flags que celui de faDirectory, ce qui implique que le test de attr=faDirectory echoue meme pour les reperoire. Il faut donc verifier si le flag repertoire est dans la liste des attributs.

    Test si 2 fichiers ont ete modifiées
    LA date est effectivement un bon moyen de tester si un fichier est modifier ou non. Mais il en existe d'autres :
    - Utilisation du flag "archive"
    - Calcul d'un checksum quelconque : CRC32, MD5. Cette methode est ideale pour s'assurer que 2 fichiers sont bien differents, mais a un cout temporel de calcul a prendre en compte.

    Bonne prog !!

Discussions similaires

  1. comparer deux fichier .xls
    Par oursquetaire dans le forum Excel
    Réponses: 6
    Dernier message: 06/07/2006, 16h52
  2. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19
  3. Comparer deux fichier
    Par Taz_8626 dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2006, 11h46
  4. comparer deux fichiers avec une api windows
    Par sweetdreamer dans le forum Windows
    Réponses: 4
    Dernier message: 25/05/2006, 22h10
  5. Fonction c qui compare deux fichiers ???
    Par babyface dans le forum C
    Réponses: 4
    Dernier message: 19/11/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo