SUPPRESSION DES REDONDANCES DE FICHIERS

Signaler
Messages postés
3804
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
30 janvier 2020
-
xtreen
Messages postés
24
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
5 juillet 2015
-
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

cyberntique
Messages postés
5
Date d'inscription
mardi 14 septembre 2010
Statut
Membre
Dernière intervention
19 décembre 2012

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.
xtreen
Messages postés
24
Date d'inscription
vendredi 12 octobre 2012
Statut
Membre
Dernière intervention
5 juillet 2015
> cyberntique
Messages postés
5
Date d'inscription
mardi 14 septembre 2010
Statut
Membre
Dernière intervention
19 décembre 2012

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
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

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
55
Date d'inscription
dimanche 20 juillet 2008
Statut
Membre
Dernière intervention
10 octobre 2015

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
3804
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
30 janvier 2020
95
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

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

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
3804
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
30 janvier 2020
95
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

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

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
3804
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
30 janvier 2020
95
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).