RECHERCHE AVANCÉE DE FICHIERS PLUS RAPIDE QUE CELLE DE WINDOWS (VB.NET 2003)

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 3 mars 2006 à 12:38
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 - 18 juin 2007 à 07:48
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/36350-recherche-avancee-de-fichiers-plus-rapide-que-celle-de-windows-vb-net-2003

cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
18 juin 2007 à 07:48
oui ça peut se faire mais je ne reviendrai plus sur ce prog désormais... l'affichage n'est qu'un détail... ce que je voulais montrer dans le prog c'est le principe de recherche plusieurs critères... merci à tous pour vos remarques
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
17 juin 2007 à 16:08
Eldim pour l'affichage en temps réel tu devrais faire une recherche asynchrone, en utilisant des délégués pour pas faire d'erreur d'appel interthreads pourquoi avec un BackGroundWorker et a chaque fin de boucle récursive tu réactualise uniquement ton listview.

Moi je fait ça pour certain programme depuis la procédure DoWork du Background Worker j'initialsé un délégué que je pointe sur ma procédure de recherche et voilà.
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
3 mai 2006 à 11:00
j'avais fait ca sous SQL 2000, et framework 1.0, je le refait entierement en 2.0 avec SQL 2005 (soyez patient), je viens de faire la scan des donnée dans la base de donnée, je suis en train de faire la detection materiel pour commencer l'archiovage apres 15 minute d'inactivé clavier/souris
enfin ce sera pas pres du jour au lendemain car je prog pas tte la journée et je voyage un peu en se moment :)
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
2 mai 2006 à 07:52
Salut TeBeCo !

ça à l'air très intéressant !!

ce serait bien si tu pouvais mettre ça sur ce site

En tout cas l'idée est très bonne
il ne manque plus qu'une mise à jour automatisée du programme via un serveur
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
27 avril 2006 à 21:48
si t'es fan d'optimisation je te propose un truc de fou plus rapide qui sera "peut etre" mis en place dans les futur version de Dows
Composants Requis =>

* Server SQL (la version gratuite suffit si vous savez tout piloté par requête)

* Bouquin sur le SQL pour ceux qui savent pas => Mr Koutchouk, fondateur du SQL a fait des version en francais SUBLIME

* VB.net forcement :)

Idée =>
* Créer une base de donnée optimisé au niveau de sa structure pour qu'une requete soit la plus directe possible qui contiendrai tte les informations sur les fichier present sur l'ordinateur concerné, a la limite 1 table par PC pour les reseaux
* Créer un service windows tournant en arrière plan qui scan le PC local et met a jour la base de donnée, ceci peut se faire de pls maniere =>
- en temps reel => Detection de creations de fichier (cf code sur le site ca prend 2 ligne a faire c'est inclus dans .net)
- Pré Programmé => lancement la nuit a des heure precise qui "generaient" personne
- Intelligente => pas de clavier, souris, ou autre peripherique utilisé pendant un certain lance l'activation du scan, et s'arrete au contraire
Ce service a donc un acces totale a la base de données pour la mettre a jour en consequence

* Une interface Windows avec acces limité (lecture seule) a la base de données permettant l'affichage et le traitement des info
Informations technique => Temps de réponse de requete SQL ? qq milliseconde a la limite si la base de donnée est mal agencée on peut compté 10 sec mais la votre ordi lag vraiment :)

* Une Interface Web qui fait la même chose pour les utilisateur réseau afin d'acceleré la recherche des fichier partage sur les reseau



Fait réel =>
J'ai mit en place ce meme système sur un reseaux d'environ 150 PC, celui ci marche relativement bien, le plus dur est de trouvé des plage horaire viable pour scanné le réseau pour ne géné personne car j'ai rajouté un pti bout de programme realisant des clé RC5(si je me goure pas sur le nom), qui permet de faire des recherche de fichier identique, par exemple si vous recupéré un gros fichier et que le PC se deconnecte, avec des programme adapté on peut ainsi savoir sur quel PC recupéré la suite

encore une optimisation possible si vous êtes par exemple administrateur réseau, le Service de scan est installé sur tte les machine qui centralise leurs resultat chaqune sur un seul est meme serveur, avec indiqcation de partage ou non et tout ce qui en decoule ...

Je suis actuellement a un pti millier de killometre de l'endroit ou j'ai installé un tel systeme je ne peut donc rien faire actuellement pour vous en montrer un bout j'en m'en excuse ...
mais bon si qqun a le courage lui aussi d'aller au bout d'un tel systeme il aura enormement de succes pour un TRES grand nombre d'utilisation
Notez que ce systeme se raproche ennormement du P2P intranet si vous rajouter la gestion des telechargement des ficheir via le reseau par flux ce qui permet de recupéré des pti morcceau sur tout les PC avec le même RC5, enfin on arrive a un monstre a posé sur un serveur indépendant

PS : Amusez vous bien :)
cs_claudetom Messages postés 115 Date d'inscription jeudi 11 octobre 2001 Statut Membre Dernière intervention 15 octobre 2012
26 mars 2006 à 17:16
Pour la colorisation d'une ligne sur 2 je préfere cela (sans prétention)
A mettre dans Private Sub sbGetFilesAndDirectoriesFromRep(ByVal Rep As String, _ .....
à la fin au dessu du Catch : ColorLigne(Color.LightBlue)'Pourquoi pas à la place une variable choisi par l'utilisateur

2) Enlever la colorisation faite dans Private Sub sbGetFilesAndDirectoriesFromRep(ByVal D As IO.DirectoryInfo, ByVal S As String, _.....
' If i Mod 2 0 Then LVI.BackColor Drawing.Color.LightBlue

3) ajouter cette Sub
Private Sub ColorLigne(ByVal CoulLigne As Color)'Passage autre valeur de couleur
For iligne As Integer = 0 To lvMain.Items.Count - 1
lvMain.Items(iligne).BackColor = Color.Empty
Next

For iligne As Integer = 0 To lvMain.Items.Count - 1 Step 2
lvMain.Items(iligne).BackColor = CType(CoulLigne, Drawing.Color)
Next
End Sub

4) En cas de click sur colonne :
dans Public Sub sbTrier(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs)...
mettre :
ColorLigne(Color.LightBlue)'Pourquoi pas a la place une variable choisi par l'utilisateur (à la fin)
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
7 mars 2006 à 08:33
Maintenant y a plus de clignotement
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
6 mars 2006 à 13:54
Bonjour Dalida,

Merci pour tes commentaires

Les try catch viennent du fait que je suis toujours trop prudent et que j'aime la précision... (un peu beaucoup et ça vire parfois à la connerie je sais mais bon...)

pour ce qui est du listview, le begin update est plus approprié... mais ce que je recherche c'est l'affichage temps réel

Et les doevents sont beaucoup efficaces que les refresh car ils évitent les problèmes de redessinement lorsqu'on change d'appli et que l'on revient dessus
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016
6 mars 2006 à 12:31
salut à tous et bravo à ELDIM,

VB Express qui m'a signalé que
dans ta fonction fnValideAdvancedSearch, il n' y pas de clause As

par ailleurs, dans tes fonctions les Catch devraient retourner une valeur (Return False pour fnValideAdvancedSearch).

pour le reste, je trouve qu'il y a beaucoup de Try...Catch. c'est une excellente précaution mais qui a forcement un impact négatif sur les preformances comme dans cmdRech_Click qui appelle sbGetFilesAndDirectoriesFromRep. l'appel de la méthode est encapsulé dans un sandwich Try..Catch et la méthode est, elle aussi, encapsulé dans un bloc Try...Catch. pour moi il y a redondance. tu dois pouvoir en supprimer plusieurs comme ça.

pour le rafraichissement tu peux aussi mettre la propriété Visible du ListView à False avant le traitement, à True ensuite. ainsi le ListView n'est pas rafraichi (gain de temps) et si tu places par exemple un Label en dessous cela te permet d'afficher un message à l'utilisateur (genre : "Recherche en cours..."). il pourrait y avoir aussi le bouton annuler, de cette façon il n'est accessible que durant la recherche.

je me pose aussi la question de la nécessité des DoEvents, je trouve cette méthode assez brutale et elle doit diminuer les performances (d'autant qu'elle appliquée à chaque passage de boucle). dans la première version de ton code j'ai essayé de les enlever et tout semblait fonctionner, dis moi ce que tu en penses !

(9/10)

[Dalida]
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
6 mars 2006 à 11:50
Merci Willi
le beginupdate c'est un choix je devrais peut-être mettre le raffraichissement en checkbox (Raffraichissement pendant recherche ou non)
Pour ce qui est des commentaires c'est vrai je suis désolé seulement j'ai fait cette pour accélérer mon travail et donc entre deux projet ce qui ne me laisse pas beaucoup de temps pour fignoler... ce qui fait que les commentaires passent à la trappe...
si y en a qui ont du mal a comprendre je peux leur expliquer

Merci encore de votre attention
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
6 mars 2006 à 11:42
Pour ceux qui est du rafraichissement du listview tu obtiens 30/40% de temps en moins si tu ne rafraichis pas celui-ci.

Bouton cmdRech:
lvMain.BeginUpdate()
sbGetFilesAndDirectoriesFromRep(txtRech.Text)
lvMain.EndUpdate()

La recherche multi-critères marche bien chez moi :)
Bonne source.

PS : Essais de mettre des commentaires à ta source.
Bonne continuation
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
6 mars 2006 à 10:54
Ben si tu fait plusieurs instances d'une même class y a plusieurs chargements en mémoire
Si tu fais une seule instance d'une class(module) y a un seul chargement... (c'est comme ça que je le vois)

La différence est flagrante sur vb Excel
ps: Je viens de faire le traitement pour la recherche multiple je vai pas tarder à mettre le source à jour (d'ici 5mn)
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
6 mars 2006 à 10:09
Eldim -> Comment ca ca ralentit les traitements une classe ?
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
6 mars 2006 à 09:55
Merci

Bon ben si tout le monde attend ça je vai m'y mettre dans la journée...
Sirocooo Messages postés 412 Date d'inscription mercredi 19 décembre 2001 Statut Membre Dernière intervention 7 avril 2008 1
6 mars 2006 à 09:34
bon travail
9/10
J'attend la recherche multi-critères avec impatience.
merci
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
6 mars 2006 à 07:59
Bonjour à vous deux,

le supendlayout n'empeche pas le listview de clignoté
j'ai essayé avec un beginupdate ça l'empeche de clignoter mais ça n'affiche pas les fichiers pendant l'exécution donc je préfère laissé pour le moment.

Quand à la recherche multiple il suffit de mettre un séparateur (genre ";" comme indiqué dans ton exemple) et de faire un split.. (tout le monde peut modifier ça)

Vous avez tous deux de bonne remarques je vous remercis pour votre attention

Lorsque j'aurais un peu de temps Willi je mettrai la modif pour la recherche multiple

ps : Pour ce qui de la mise en class je ne le fait pas car je trouve que ça ralenti beaucoup les traitements en général et lorsque les traitements sont simples je ne trouve pas util de les mettre en class
cs_FraGag Messages postés 81 Date d'inscription jeudi 19 février 2004 Statut Membre Dernière intervention 18 avril 2008
4 mars 2006 à 03:33
Windows XP recherche également dans les fichiers *.zip et *.cab (peut-être y a-t-il d'autres formats supportés ?), ce qui ralentit évidemment la recherche. C'est peut-être là que se trouve le gain de temps.
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
3 mars 2006 à 13:36
Quelque chose de sympa à prendre en compte serait d'avoir un pattern de recherche multiple et non de pouvoir rechercher qu'un seul critère.
Par exemple de pouvoir rechercher plusieurs types de fichiers *.jpg;*.tmp;*.exe sa serai bien :)
Ah aussi commente ton code !
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
3 mars 2006 à 13:11
Salut Willi !
Merci de tes commentaires

Je regarderai ça la semaine prochaine

Mais je t'assure que sur mon pc c'est bien plus rapide que windows XP

Bon week end
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
3 mars 2006 à 12:38
Salut,
Plus rapide que windows alors la euh faut voir :)
Sinon essais un lvMain.SuspendLayout avant de débuter la recherche et à la fin un lvMain.ResumeLayout pour actualiser ta listview car sa pique les yeux le rafraichissement continue de ton listview.
Sinon une classe aurait été préférable pour la recherche car la y en a dans tout les sens dans ta feuille.
La recherche par date ou par taille est pas mal meme si je n'ai pas regardé le ceode pour cette partie la.
Pas noté pour le moment attente d'une mise à jour peut-etre :D
Bonne continuation
Rejoignez-nous