Soft en delphi : comparateur de fichiers

Soft en delphi : comparateur de fichiers - Delphi/Pascal - Programmation

Marsh Posté le 16-01-2003 à 12:14:32    

Si ça en intéresse certains, j'ai développé un petit soft qui permet de trouver les fichiers identiques ayant ou pas une même extension) dans un répertoire et ses sous-répertoires. De plus, il y a un mode de comparaison permettant de dire si un fichier est inclu dans un autre (du point de vu du contenu). Pour télécharger, c'est ici :
http://www.2001-space-odyssey.net/~chris/
ou http://chris.jav.chez.tiscali.fr
menu "Programmation", rubrique "SameFilesDetector"
 
@+

Reply

Marsh Posté le 16-01-2003 à 12:14:32   

Reply

Marsh Posté le 16-01-2003 à 13:56:57    

C rapide ? (optimisé j'entend :D)
ya les sources ?
 
 :hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 16-01-2003 à 14:09:24    

Sympa :jap:  
 
On peut voir les sources, juste pour voir comment tu as implémenté ton soft :hello:


---------------
Scully: Mulder, there something out there ; Mulder: I know. I've been saying that for years
Reply

Marsh Posté le 16-01-2003 à 14:26:20    

Citation :

Site visible uniquement avec Internet Explorer


 
:o

Reply

Marsh Posté le 16-01-2003 à 15:42:45    

Comment on télécharge ?
 
 :??:

Reply

Marsh Posté le 16-01-2003 à 15:43:37    

Y'a un lien mais c'est juste pour l'exe ;)


Message édité par Thander le 16-01-2003 à 15:44:25

---------------
Scully: Mulder, there something out there ; Mulder: I know. I've been saying that for years
Reply

Marsh Posté le 16-01-2003 à 15:44:48    

Si y a pas les sources je vois pas fort l'intérêt de mettre le topic ici, d'autant plus qu'il y a déjà le même topic sur Soft & Réseaux :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-01-2003 à 08:48:05    

antp a écrit :

Si y a pas les sources je vois pas fort l'intérêt de mettre le topic ici, d'autant plus qu'il y a déjà le même topic sur Soft & Réseaux :o


 
non, y'a pas les sources... J'ai essayé d'optimiser les fonctions lisants les fichiers puis les comparants (octet par octet). J'ai utiliser les classes TStreamFile pour la lecture des fichiers et TStreamMemory pour la comparaison. Je charge qu'une fois le fichier à comparer et je charge au fur et à mesure les autres fichiers puis je passe au fichier suivant à comparer, etc. Si y'a des moyens plus rapides (autres qu'une routine en asm), je suis preneur... :)

Reply

Marsh Posté le 17-01-2003 à 09:46:50    

tu charges tout le fichier en même à chaque fois et tout l'autre fichier à comparer ?


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 17-01-2003 à 10:25:30    

rufo a écrit :


 
non, y'a pas les sources... J'ai essayé d'optimiser les fonctions lisants les fichiers puis les comparants (octet par octet). J'ai utiliser les classes TStreamFile pour la lecture des fichiers et TStreamMemory pour la comparaison. Je charge qu'une fois le fichier à comparer et je charge au fur et à mesure les autres fichiers puis je passe au fichier suivant à comparer, etc. Si y'a des moyens plus rapides (autres qu'une routine en asm), je suis preneur... :)


 
Un meilleurs moyen qu'un algo en n^2 dans lequel chaque étape consiste à charger un fichier en mémoire, à le comparé à un autre puis a libéré la mémoire ? Naaaan tu ne trouveras probablement pas.
 
Bien sur, j'aurais peut-être pu t'aider mais j'aime pas ton site :D

Reply

Marsh Posté le 17-01-2003 à 10:25:30   

Reply

Marsh Posté le 17-01-2003 à 10:27:41    

Kristoph a écrit :


 
Un meilleurs moyen qu'un algo en n^2 dans lequel chaque étape consiste à charger un fichier en mémoire, à le comparé à un autre puis a libéré la mémoire ? Naaaan tu ne trouveras probablement pas.
 
Bien sur, j'aurais peut-être pu t'aider mais j'aime pas ton site :D


 
rancunié va :) Je suis un gentil pourtant lol...

Reply

Marsh Posté le 17-01-2003 à 10:28:54    

[SDF]Poire a écrit :

tu charges tout le fichier en même à chaque fois et tout l'autre fichier à comparer ?


 
je charge une fois le fichier à comparer puis un à un tous les autres fichiers pour les comparer au premier...

Reply

Marsh Posté le 17-01-2003 à 10:50:41    

euh... j'imagine la comparaison de fichier VOB ou de films (d'images ghost aussi) ça pourrait être drôle.... :whistle:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 18-01-2003 à 12:33:30    

[SDF]Poire a écrit :

euh... j'imagine la comparaison de fichier VOB ou de films (d'images ghost aussi) ça pourrait être drôle.... :whistle:  


 
oui, j'y ai réfléchi... A priori, vu que j'utilise la ram, j'avais fait un test qui me fait penser que Windows fait du swap quand je demande d'allouer plus de mémoire qu'il y en a de disponible...

Reply

Marsh Posté le 18-01-2003 à 13:00:12    

Allez, voici un premier truc pour toi :
 
"La taille du fichier".

Reply

Marsh Posté le 18-01-2003 à 13:12:50    

rufo a écrit :


 
oui, j'y ai réfléchi... A priori, vu que j'utilise la ram, j'avais fait un test qui me fait penser que Windows fait du swap quand je demande d'allouer plus de mémoire qu'il y en a de disponible...


T'as combien de swap ? un VOB ça fait 1Go si tu copare un VOB à un autre VOB tu utilises 2Go de mem  :ouch: !!!!!!!!!!!!! (ça plantera avant je pense :D)

Reply

Marsh Posté le 18-01-2003 à 19:26:09    

[SDF]Poire a écrit :


T'as combien de swap ? un VOB ça fait 1Go si tu copare un VOB à un autre VOB tu utilises 2Go de mem  :ouch: !!!!!!!!!!!!! (ça plantera avant je pense :D)


 
à mon avis, pour comparer des vob, je crois que ça ira plus vite de les lancer et de regarder la première minute :D plutôt que d'utiliser mon soft...

Reply

Marsh Posté le 18-01-2003 à 23:56:13    

C T un exemple :D
 
les buffers C bien [:zion]


Message édité par [SDF]Poire le 18-01-2003 à 23:56:36
Reply

Marsh Posté le 20-01-2003 à 09:36:03    

[SDF]Poire a écrit :

C T un exemple :D
 
les buffers C bien [:zion]


 
oui, mais comment je fais pour lire qu'une seule fois le fichier à comparer avec els buffers?

Reply

Marsh Posté le 20-01-2003 à 10:44:24    

tu bufferises les 2 :D


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 20-01-2003 à 14:48:55    

[SDF]Poire a écrit :

tu bufferises les 2 :D


 
j'ai un pb : je passe à la fonction chargée de faire la comparaison un pointeur sur le buffer du fichier "source" entièrement chargé (à comparer aux autres fichiers) et le nom du fichier à comparer...

Reply

Marsh Posté le 20-01-2003 à 17:19:14    

Pour ceux qui auraient déjà téléchargé mon soft, j'ai mis une MAJ de mon soft car la fonction STOP n'était pas compètement implémentée. Désolé, un petit oubli...

Reply

Marsh Posté le 21-01-2003 à 10:29:50    

je pense à un truc, si tu dois juste retrouver des doublons (et non pas trouver les doublons d'un fichier précis), ça serait pas plus facile de faire une liste de checksum (md5 ou autre), de trier cette liste par ordre alphabétique, puis de comparer vraiment les fichiers sont les checksums sont identiques ?


Message édité par antp le 21-01-2003 à 10:30:42

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 21-01-2003 à 11:39:16    

Ce truc m'interresse car j'ai une collection de fichiers mp3 dont certains sont des doublons. Mais si ca tourne pas sous Linux je n'en veux pas :D
 
Moi je ferais ça comme ça :
 
- obtenir une liste de tous les fichiers à traiter+leur taille
- grouper les fichiers par paquets de même taille
- calculer les md5 sum de tous les fichiers qui sont dans un groupe de cardinal > 1
 
Et pour finir :
 
- même checksum md5 = même fichier
Ou
- "mode complet" qui va vraiment tester le contenu des fichiers qui ont le même checksum md5
 
Dans le cas ou tous les fichiers sont identiques, cette méthode est plus lente que la tienne :D

Reply

Marsh Posté le 21-01-2003 à 12:30:04    

Kristoph a écrit :

Ce truc m'interresse car j'ai une collection de fichiers mp3 dont certains sont des doublons. Mais si ca tourne pas sous Linux je n'en veux pas :D
 
Moi je ferais ça comme ça :
 
- obtenir une liste de tous les fichiers à traiter+leur taille
- grouper les fichiers par paquets de même taille
- calculer les md5 sum de tous les fichiers qui sont dans un groupe de cardinal > 1
 
Et pour finir :
 
- même checksum md5 = même fichier
Ou
- "mode complet" qui va vraiment tester le contenu des fichiers qui ont le même checksum md5
 
Dans le cas ou tous les fichiers sont identiques, cette méthode est plus lente que la tienne :D


 
D'ailleurs, j'ai fini de le faire en Python, voici le code :)
 

Code :
  1. #!/usr/bin/env python
  2. import os
  3. import md5
  4. class FileInfo:
  5. def __init__(self, filename):
  6.  self.filename = filename
  7.  self.filesize = os.path.getsize(filename)
  8.  self.md5sum = None
  9. def __lt__(self, other):
  10.  if self.filesize < other.filesize:
  11.   return 1
  12.  elif self.filesize == other.filesize:
  13.   return self.md5sum < other.md5sum
  14.  else:
  15.   return 0
  16. def probablySame(self, other):
  17.  return (self.filesize == other.filesize) and (self.md5sum == other.md5sum)
  18. def __str__(self):
  19.  return "%s : (%d," % (self.filename, self.filesize) + str(self.md5sum) + " )"
  20. def computeMd5sum(self):
  21.  if self.md5sum == None:
  22.   m = md5.new()
  23.   f = open(self.filename, "rb" )
  24.   r = f.read(1024)
  25.   while len(r) > 0:
  26.    m.update(r)
  27.    r = f.read(1024)
  28.   self.md5sum = m.hexdigest()
  29. class FileList:
  30. def __init__(self):
  31.  self.filelist = []
  32. def addFile(self, dirname, filenames):
  33.  for f in filenames:
  34.   fi = os.path.join(dirname, f)
  35.   if not os.path.isdir(fi):
  36.    self.filelist.append(FileInfo(fi))
  37. def postProcess(self):
  38.  if len(self.filelist) == 0:
  39.   return
  40.  self.filelist.sort()
  41.  fi2 = self.filelist[0]
  42.  for i in range(len(self.filelist)-1):
  43.   fi1 = fi2
  44.   fi2 = self.filelist[i+1]
  45.   if fi1.filesize == fi2.filesize:
  46.    fi1.computeMd5sum()
  47.    fi2.computeMd5sum()
  48.  self.filelist.sort()
  49. def showSame(self):
  50.  if len(self.filelist) == 0:
  51.   return
  52.  fi2 = self.filelist[0]
  53.  for i in range(len(self.filelist)-1):
  54.   fi1 = fi2
  55.   fi2 = self.filelist[i+1]
  56.   if fi1.probablySame(fi2):
  57.    print """File "%s" and "%s" are the same""" % (fi1.filename, fi2.filename)
  58. def walkResult(arg, dirname, filenames):
  59. arg.addFile(dirname, filenames)
  60. def findDup():
  61. fl = FileList()
  62. os.path.walk(".", walkResult, fl)
  63. fl.postProcess()
  64. fl.showSame()
  65. findDup()

Reply

Marsh Posté le 22-01-2003 à 08:59:23    

Effectivement, je fais bien une liste des fichiers à traiter (nom du fichier + taille) et je les regroupe par taille (tri croissant) puis je compare le contenu (pas de md5). Ca pourrait aller plus vite avec le md5...
Par contre, pour ma fonction de détection d'un fichier inclu dans un autre, le md5, ca marche?
ex: un fichier contient uniquement la chaîne "abcd" et un autre, uniquement la chaîne "abcdef" -> le premier fichier est inclus dans le second.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed