f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
26 juil. 2006 à 06:03
cs_pseudo3
Messages postés268Date d'inscriptionmardi 24 juillet 2007StatutMembreDerniè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.
cs_pseudo3
Messages postés268Date d'inscriptionmardi 24 juillet 2007StatutMembreDernière intervention 2 février 20211 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 11 janv. 2008 à 23:14
Merci, et content de pouvoir aider ;-)
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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és4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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és1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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 !
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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 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és4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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és4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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.
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.
28 mars 2011 à 14:12
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+.
11 janv. 2008 à 23:14
11 janv. 2008 à 23:00
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
28 juil. 2006 à 07:51
Vous êtes trop mathématiques les gars :-D
27 juil. 2006 à 11:11
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 ? ;-)
27 juil. 2006 à 10:54
par contre elle affiche de moins bonne performance que celle deja proposée.
mais la technique reste cependant trés interressante et a connaitre.
26 juil. 2006 à 19:33
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;
26 juil. 2006 à 16:23
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 !
26 juil. 2006 à 13:53
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 :-)
26 juil. 2006 à 13:38
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 :-)
26 juil. 2006 à 13:35
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
26 juil. 2006 à 08:27
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];
26 juil. 2006 à 08:21
Mais bon le but ici était la recursivité, pas que mon truc nettoye le PC correctement.
Merci fOxy pour tes connaissances...
26 juil. 2006 à 08:19
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 ? :-(
26 juil. 2006 à 06:06
26 juil. 2006 à 06:03
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.