POUR LES DEBUTANTS : NETTOYAGE RECURSIF

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 26 juil. 2006 à 06:03
cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 - 28 mars 2011 à 14:12
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/38776-pour-les-debutants-nettoyage-recursif

cs_pseudo3 Messages postés 268 Date d'inscription mardi 24 juillet 2007 Statut Membre Dernière intervention 2 février 2021 1
28 mars 2011 à 14:12
Bonjour,

Jai testé le code par curiosité mais j'ai un problème ici :

{ Temporaires }
if ( CheckTemp.Checked ) then
begin Nettoyage( GetEnvironmentVariable( 'TEMP' ) ); //<- Message [Erreur] main.pas(130): Pas assez de paramètres originaux !!!
Nettoyage( GetEnvironmentVariable( 'TMP' ) );
Nettoyage( BackSlach( GetEnvironmentVariable( 'windir' ) ) + 'temp' );
end;
Pour les Temporaires le compilo m'affiche "Message [Erreur] main.pas(130): Pas assez de paramètres originaux" et c'est pareil avec les lignes 131 et 132.

Comme j'utilise Delphi-5 par quoi dois-je remplacer ces trois lignes ??? S.V.P

A+.
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
11 janv. 2008 à 23:14
Merci, et content de pouvoir aider ;-)
Oniria Messages postés 292 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 18 décembre 2014 3
11 janv. 2008 à 23:00
Bonjour,

J'avais besoin d'un code de construction d'un arbre (exploration à partir d'un répertoire de base et tous les fichiers, tous les sous répertoire). Je me suis inspiré de ton code récursif et ca marche nickel, c'est simple, efficace.

Merci pour ce code qui je trouve explique bien l'utilité de la récursion...

Oniria
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
28 juil. 2006 à 07:51
hé ben japee c'est un truc de fou ton truc .. bravo !

Vous êtes trop mathématiques les gars :-D
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 juil. 2006 à 11:11
Salut f0xi,

Je n'ai pas testé la rapidité, mais je pense que je dois perdre pas mal avec Concat().
Ouais, je trouve que l'approche est... heu... inédite ? ;-)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 juil. 2006 à 10:54
Japee, ta fonction est pas mal, application d'une technique trés utile parfois.
par contre elle affiche de moins bonne performance que celle deja proposée.

mais la technique reste cependant trés interressante et a connaitre.
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
26 juil. 2006 à 19:33
Salut,

Voilà une source qui a le mérite d'introduire un débat sur l'utilisation de l'Api. Je n'ai pas d'avis définitif sur la question, mais je pense que si on peut s'en passer, encapsulées ou pas...

A noter que les fonctions IncludeTrailingPathDelimiter et IncludeTrailingBackslash ne sont pas disponibles pour les vieilles versions de Delphi (D4 par exemple).

Voici la dernière évolution de mon IncludeTrailingBackslash, pour ceux que ça intéresse :

function MyIncludeTrailingBackslash(const Path: string): string;
const
Slash: array[Boolean] of string = ('','\');
begin
Result := Concat(Path, Slash[(Path <> '') and (Path[Length(Path)] <> '\')]);
end;
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 juil. 2006 à 16:23
Désolé mais j'ai oublié de mettre "Registre.CloseKey;" après le finally dans la fonction LitCle, j'y ait vu trop tard.

Sinon sans l'API Windows on perd des attributs de fichier comme FILE_ATTRIBUTE_TEMPORARY, FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_COMPRESSED

En API pur sans fenetre si on fait un thread avec une recherche recursive, on à un fichier de 14 Ko, là il fait presque 500 Ko (c'est dommage !).

Sinon voila j'ai bien appliqué les conseils de fOxy !
Utilisateur anonyme
26 juil. 2006 à 13:53
Je sais, en fait c'est une correction de la proposition de modification de F0xi :-)

Pour moi, l'utilisation des API sont souvent assimilés à un niveau initié mais je me trompe peut être ...

C'est pas un reproche mais juste un avis (moi j'ai tout compris, enfin je crois :-))

Et .. de rien :-)
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 juil. 2006 à 13:38
J'ai pas utilisé MessageDlg !?

Bon j'ai compris, je vais refaire le programme sans API :-D

Mais pas tout de suite, j'ai d'autres trucs a finir pour le moment (et oui y'en a qui son pas encore en vacance).

Je le referai, promis !

Et .. merci :-)
Utilisateur anonyme
26 juil. 2006 à 13:35
Salut,

moi il y a un truc qui me chagrine ...

tu dis que la source est faite pour les débutants (exemple de récursivité).

Mais le fait d'utiliser les API (à mon avis) risque de perturber les débutants.

L'ensemble du code me parait plus difficile à lire qu'avec les fonctions de DELPHI, après pour les API qui n'ont pas étés implémentés en DELPHI là oui mais sinon le gain est minime (sauf pour la création de Form(-300Ko) Button etc...)

En ce qui concerne les temps d'exécution (voir commentaire de F0xi)ça se compte en nano secondes (sauf pour les grosses boucles mais ce n'est pas le cas ici) ... mais c'est toujours bon à savoir.

Petite correction :

MessageDlg('CleanUp 2.7 - Quick Edition' + #10 + #10 +
'Logiciel de nettoyage rapide' + #10 + #10 +
'Démonstration de récursivité pour CodeSource' + #10 + #10 +
'Par LEVEUGLE Damien' + #10 +
'Elguevel (c) 2006' ), mtINFORMATION, [mbOk], 0);
*\^^/*
Je pense que le MessageDlg fonctionnera mieux sans cette parenthèse :-)

Bonne prog et
@+
Cirec
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 juil. 2006 à 08:27
Au faite pour évité d'utiliser la librairie Math avec ton

for i := 0 to Min(sGrid.ColCount-1,high(ENTETE_GRILLE)) do
sGrid.Cells[I,0] := ENTETE_GRILLE[I];

Pourquoi pas faire : for I := 0 to (Length(ENTETE_GRILLE) - 1) do sGrid.Cells[I,0] := ENTETE_GRILLE[I];
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 juil. 2006 à 08:21
Ah oui puis pour les Index.dat et autres fichiers en cours d'utilisation, je sais qu'il ne peuvent etre éffacé, c'est pour çà que j'affiche "Supprimé" ou "Non supprimé".

Mais bon le but ici était la recursivité, pas que mon truc nettoye le PC correctement.

Merci fOxy pour tes connaissances...
elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
26 juil. 2006 à 08:19
Et oui mais comme je disais plus bas j'etais partie sur un truc pur API, puis quand j'ai vu le bordel que c'etait j'ai réecris certaine routines avec les classes de Borland pour que ce soit plus lisible. Donc c'est vrai que le mélange là c'est un peu caca.

Pour le processMessage, je ne l'ai pas mis car la grille est déja rafraichie dans le thread de nettoyage.

Et pour Application.Terminate, je suis désolé mais j'ai toujours fait comme çà, j'ai toujours cru que c'etait mieux qu'un simple Close()... on en apprend tout les jours :-)

Pour la MessageBox des crédits, c'est juste parce que je voulais pas me faire chier, c'est tout :-D (je suis très feignant !)

Mais si tu veux je veux bien remplacer mon Slach par IncludeTrailingPathDelimiter et utiliser un TSearchRec pour la rechreche.

Il est vrai que j'aime bien l'API windows : plus dur à mettre en oeuvre mais les exe peuvent tomber sous les 20Ko et on evite de passer par des fonctions qui de toutes manière vont finir par utiliser les API.

Dite Docteur c'est grave ? :-(
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 juil. 2006 à 06:06
ah aussi, je n'ai pas fait attention mais les fichiers Index.dat ne doivent pas etre supprimés et sont logiquement impossible a supprimer.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 juil. 2006 à 06:03
pourquoi utiliser l'API windows ? cela rend le programme non portable et surtout les fonction delphi assure plus d'information et moins de convertions au final.
certe le programme s'allourdis (si peu) mais il est plus performant.


exemple :

on gagne la moitiée du temps d'execution sur cette routine en l'ecrivant de la sorte tout en la laissant portable :

function Slach(const Dossier : string ) : string;
var L : integer;
begin
L := Length(Dossier);
result := dossier;
if Dossier[L] <> '\' then begin
SetLength(Result,L+1);
result[L+1] := '\';
end;
end;



petite erreur egalement ici :

procedure TMainForm.FormCreate(Sender: TObject);
var
I : Integer;
begin
for I := 0 to (sGrid.ColCount - 1) do sGrid.Cells[I, 0] := ENTETE_GRILLE[I]; // Place les entêtes dans la StringGrid
end;

comment etre sur que ColCount soit egal a high(ENTETE_GRILLE) si on ne fait pas le test ?

for i := 0 to Min(sGrid.ColCount-1,high(ENTETE_GRILLE)) do
sGrid.Cells[I,0] := ENTETE_GRILLE[I];

comme cela, on est sur d'eviter de potentiel erreur de debordement ... vus qu'on se base sur la plus petite valeur obtenue.


procedure TMainForm.BtnQuitClick(Sender: TObject);
begin
Application.Terminate;
end;

aie aie aie ... TMainForm.Close est mieux que application.Terminate sinon on perd les evements OnCloseQuery, OnClose et OnDestroy des fiches!!!
Application.Terminate reviens a faire Halt(0) ou encore de tuer le processus.
ce qui n'est pas une bonne methode pour fermer une application.

non franchement ne pas utiliser l'API windows ...

MessageDlg('CleanUp 2.7 - Quick Edition' + #10 + #10 +
'Logiciel de nettoyage rapide' + #10 + #10 +
'Démonstration de récursivité pour CodeSource' + #10 + #10 +
'Par LEVEUGLE Damien' + #10 +
'Elguevel (c) 2006' ), mtINFORMATION, [mbOk], 0);

c'est quand meme mieux, le mieux etant encore de faire une vrai fiche "a propos"


for Boucle := 1 to NbPass do begin

{ Remet grille à Zero }
GridRAZ( SGrid );

{ Historique }
if ( CheckHistory.Checked ) then Nettoyage( LitCle( HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'History' ) );

{ Cache IE }
if ( CheckCache.Checked ) then Nettoyage( LitCle( HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Cache' ) );

{ Cookies }
if ( CheckCookies.Checked ) then Nettoyage( LitCle( HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Cookies' ) );

{ Recent }
if ( CheckRecent.Checked ) then Nettoyage( LitCle( HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders', 'Recent' ) );

{ Temporaires }
if ( CheckTemp.Checked ) then
begin
Nettoyage( GetEnvironmentVariable( 'TEMP' ) );
Nettoyage( GetEnvironmentVariable( 'TMP' ) );
Nettoyage( Slach( GetEnvironmentVariable( 'windir' ) ) + 'temp' );
end;

Application.ProcessMessage;
end;

toujours mettre un ProcessMessage dans les boucles qui pourrait etre longue a executée.
on pourrait egalement ajouter un control Stop ou Abandon dans la boucle pour mettre fin prematurement si ça mets trop de temps.
car sur certaine machine, les dossiers temporaire et cookies sont remplis de milliers de fichiers et le mieux pour les supprimer c'est un bon vieux Del *.* en mode console (c'est ce qu'il y a de plus rapide et evite le passage par la restauration systeme)



sinon le reste me semble correct malgrés que je trouve que l'idée de l'utilisation de l'API windows uniquement est une mauvaise idée.
Rejoignez-nous