SUPPRESSION DES REDONDANCES DE FICHIERS

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 29 févr. 2012 à 16:39
xtreen Messages postés 24 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 5 juillet 2015 - 20 août 2013 à 12:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54105-suppression-des-redondances-de-fichiers

xtreen Messages postés 24 Date d'inscription vendredi 12 octobre 2012 Statut Membre Dernière intervention 5 juillet 2015
20 août 2013 à 12:36
mais c'est quant même essayé pour un début, si on pouvait tous être aussi généreux dans le but d'aider d'autre personnes apprenants
cyberntique Messages postés 5 Date d'inscription mardi 14 septembre 2010 Statut Membre Dernière intervention 19 décembre 2012
19 déc. 2012 à 11:02
Comprenez que ce n'est pas un code d'expert bien que maintenant je ne soit plus capable de produire un tel code.Je l'avais fait à l'époque pour mettre en pratique ce que j'avais appris en langage C.J'étais au tout début de mon apprentissage de ce langage.Donc inutile d'être grossier avec moi.
entierement d'accord avec les réponses précédentes... le code est sale :
int main(int argc,char *argv[])/* sur cette ligne, erreur des vieux compilers qui vont même pas voir le prog qui pourrait etre un sous-prog de son() lol... et si le fichier compilé bug dans la premiere fonction, tu pourras jamais voir le début du gros process... donc suprimmer TAB début ligne 227 semble correct ...ensuite... je trouve que ca fait saleté de tenter l'equation x1 * x2 = 0 en detection de fichier similaire... et puis... si on voulait qu'un prog lise des fichiers pour les comparer, où est l'interet de mettre leurs parametres ou même des blocs qu'ils sont, en comparaison apres un fget() pour finir par un fclose(), c'est faire en quelque sorte un travail de trop qui va faire laguer le processeur avant même d'avoir comparé les bits. aucun interet a retenir le chemin d'acces a un fichier qui se trouve visible pour l'utilisateur comme pour un programme, a moins de désirer changer son emplacement, et non de supprimmer les doublons... de toutes facons, le prog est inéficace pour qui n'aurait pas les droits d'admin sur une machine.

for(i=0;i<taillebloc;++i) //Si les nombres récupérés sont identiques, on parcoure chacune des cases des deux tableaux.
/*N'importe NAWAK... en fin de compte de compte si on a 2 fois le même fichier texte mais que les 2 sont ecrit dasn une font différente..? et 2 photos pareille avec une correction gamma ou plus de contraste...? 5 fois le même mp3s, mais dans un echantillonage différent...? alors le prog a fait surchauffé notre machine pour pas grand chose...
Perso, je trouve cet ennorme bout de code totalement nul..parce que si tu le lances sur sur un reseau qui partage des fichers, la liste des fichiers serait trop volumineuse et ce petit bout de code serait intempestif: while(fgets(string0,1000,struct_fichier0.ptr_fichier)!=NULL)
mieux vaut limiter avec un > MAX une telle boucle !
cyberntique Messages postés 5 Date d'inscription mardi 14 septembre 2010 Statut Membre Dernière intervention 19 décembre 2012
8 juin 2012 à 07:34
Monsieur je ne comprend pas très bien votre préoccupation.Expliquez la moi plus en profondeur.Je suis tout à votre disposition.
kml404 Messages postés 53 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 10 octobre 2015
7 juin 2012 à 21:07
Bonsoir! j'ai fait copie d'ajouter dans un fiche de VB 2010 qui a dit c'est à échoué votre code...
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
10 mars 2012 à 19:36
Tout est ici:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761%28v=vs.85%29.aspx
C'est une notion avancée, qui n'est pas simple d'utilisation.

A noter que le problème de lenteur de ton code ne vient pas de la non utilisation de cette fonction, mais de la méthode que tu as choisie. Dans un premier temps, passe au calcul de crc32 (plus rapide qu'un md5 ou qu'un sha-1). Tu verras une sacré différence !
cyberntique Messages postés 5 Date d'inscription mardi 14 septembre 2010 Statut Membre Dernière intervention 19 décembre 2012
10 mars 2012 à 19:26
Peux tu me donner des précision sur le mappage des fichiers et surtout sur la fonction GetMapViewOfFile?
cyberntique Messages postés 5 Date d'inscription mardi 14 septembre 2010 Statut Membre Dernière intervention 19 décembre 2012
10 mars 2012 à 19:24
Saches que j'ai pris bonne note de tout ce que tu as dit et j'en tiendrai compte pour mon prochain code.Merci
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
10 mars 2012 à 18:57
J'ai retiré la mention "code louche" suite à ta modification. Sache qu'il est extrêmement impoli de modifier la configuration d'un utilisateur à son insu. Et si la taille de la fenêtre que tu as choisi ne convient pas à l'utilisateur ? Il fait quoi ?
D'une manière générale, ne jamais appliquer ses propre goûts sur celui des utilisateurs, et ne jamais modifier quoi que ce soit sur leurs machines à leur insu.
cyberntique Messages postés 5 Date d'inscription mardi 14 septembre 2010 Statut Membre Dernière intervention 19 décembre 2012
10 mars 2012 à 18:39
Tu as raison a bien des points de vue.En fait je n'ai pas encore lu des cours sur le mappage de fichiers.En ce qui concerne la partie
for(i=0;i<taillebloc;++i)
{
if(buffer0[i]==buffer1[i])
continue; // Besoin d'un continue, il suffit de ne rien faire
else // En cas d'instruction débranchante, pas besoin de else
break;
}
je l'ai écrite ainsi pour la lisibilité du code.Mais si ca dérange alors je la changerai.Quant à la modification de la taille de l'écran via la base de registre, je voulais que l'écran ait la même taille chez tous les utilisateurs.
Jel_fish Messages postés 1 Date d'inscription jeudi 15 septembre 2005 Statut Membre Dernière intervention 5 mars 2012
5 mars 2012 à 09:56
La modification du registre ne fait que modifier la taille (hauteur) de la console pour l'utilisateur (Current User)
La clé existe (sous XP, Windows7), donc je n'aime pas 'add' (avec l'écrasement sans confirmation du '/f')
Qui plus est, c'est inutile, car on peut toujours le faire manuellement.
Pour moi, ligne à supprimer sans hésitation.
Pas dangereuse, mais incorrecte vis à vis de l'utilisateur.
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
29 févr. 2012 à 16:39
Bonjour.
J'ai plusieurs remarques.

Remarques conceptuelles==
Comparer les fichiers charactères à charactères, c'est un peu sous efficace. Il existe de nombreuse technique bien meilleures. Tu pourrais par exemple calculer le crc32 de chaque fichier et ne comparer que les crc32 entre eux. Rien que ça devrait te faire gagner "*énormément* (surtout que le via la combinatoire des fichiers à tester, on amortit rapidement le coût du calcul d'un crc32).
Au lieu d'ouvrir ton fichier, tu pourrais le mapper (via mmap ou GetMapViewOfFile), ça te ferais gagner aussi en performance.

Là, c'est beaucoup trop lent.

Remarques techniques==
Le code est assez... sale. On a une fonction monolithique géante qui pourrait facilement être factorisé. Une fonction ne devrait pas excéder une cinquantaine de lignes.
Il y a des maladresses de code, comme:
for(i=0;i<taillebloc;++i)
{
if(buffer0[i]==buffer1[i])
continue; // Besoin d'un continue, il suffit de ne rien faire
else // En cas d'instruction débranchante, pas besoin de else
break;
}

Devrait plutôt être:
for(i=0;i<taillebloc;++i)
if(buffer0[i] != buffer1[i])
break;

- Les exit(0) partout, c'est assez horrible. On quitte le code proprement et pas à l'arrache avec un exit.
- Y a pas mal d'endroit où on a carrément des copier coller de code ! L'utilisation d'une fonction aurait tout de même été bien plus judicieux.

Dernière remarque:

Je ne connais pas très bien Windows, mais ceci modifie le registre non ?
system("reg add HKCU\\Console\\ /v WindowSize /t REG_DWORD /d 03670184 /f");

Je ne suis pas sur que l'utilisateur en soit très satisfait (pour cette raison, je vais temporairement marquer ta source comme "louche", et je vais te demander de retirer les appels à modifications du registre).
Rejoignez-nous