begin process at 2012 02 17 09:09:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > FILESYSTEMLIBRARY, TOUT (+ QUE FSO) SUR LES FICHIERS/DOSSIERS/DISQUES

FILESYSTEMLIBRARY, TOUT (+ QUE FSO) SUR LES FICHIERS/DOSSIERS/DISQUES


 Information sur la source

Note :
10 / 10 - par 5 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichier / Disque Classé sous :fichier, dossier, disque, library, fso Niveau :Expert Date de création :22/04/2007 Date de mise à jour :29/04/2007 19:52:23 Vu / téléchargé :10 265 / 1 747

Auteur : violent_ken

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (83)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Bonjour à tous, ce code source est une "library" complète de fonctions qui permet de récupérer des infos et d'agir sur les fichiers/dossiers/disques logiques et physiques.

Un code un peu à la manière de FSO (d'ailleurs j'ai repris les noms des méthodes/propriétés), mais en plus complet.



Ce code s'organise de la manière suivante :

-FileSystem est une classe contenant toutes les fonctions nécessaires à l'obtention des infos et à la gestion des objets
-les classes File, Folder, Drive et PhysicalDisk sont des objets dont le nom est explicite, ils contiennent des properties et des méthodes
-les classes Files, Folders, Drives et PhysicalDisks qui sont des collections des objets File, Folder, Drive et PhysicalDisk.
-la classe ISearchEvent qui est à implémenter pour les events sur la recherche de fichiers par critères


Les collections gèrent le For Each ... In..., merci à ShareVB pour son (excellent) tuto !
Et merci à Renfield pour son tuto "perso" sur les interfaces.





Maintenant le (très long) listing des propriétés et méthodes des 5 classes ...


1) CLASSE FILE (objet fichier)
A. Méthodes

-RefreshInfos (refresh les propriétés de la classe)
-Copy
-CutFile (permet de découper le fichier en paquets de taille fixe ou bien en nombre de fichiers fixe. Voir ma source fusionneur/découpeur)
-Delete
-Move
-MoveToTrash (poubelle)
-Crypt
-Decrypt
-ShowPropertyBox (affiche la boite de dialogue propriétés de Windows)
-Rename
-DoesFileExist (fichier existant ou pas)
-IsFileAvailable (fichier dispo ou pas)
-ChangeAttributes
-ReadFileString (lecture dans le fichier)
-WriteFileString (écriture dans le fichier)
-GetIcon (récupère l'icone sous forme de IPictureDisp)
-SetDates (change les dates du fichier)
-Sanitize (lance la sanitization du fichier ATTENTION ==> C'EST LA DESTRUCTION IRREVERSIBLE DU FICHIER !)

B. Propriétés

-DriveName As String
-FolderName As String
-Drive As Drive (récupère l'objet Drive contenant le fichier)
-Path As String (path du fichier)
-Attributes As FileAttributes (attributs)
-FileExtension As String (extension)
-Folder As Folder (récupère l'objet Folder contenant le fichier)
-FileType As String (type de ficheier)
-AssociatedExecutableProgram As String (programme associé à l'ouverture du fichier)
-FileSize As Currency (taille, support des tailles >4Go)
-FileCompressedSize As Currency (taille compressée)
-DateCreated As String (date de création)
-DateLastModified As String (date de dernière modif)
-DateLastAccessed As String (date de dernier accès)
-IsHidden As Boolean
-IsReadOnly As Boolean
-IsSystem As Boolean
-IsNormal As Boolean
-IsArchive As Boolean
-IsCompressed As Boolean
-ShortName As String (nom court)
-ShortPath As String (path court)
-FileVersionInfos As FileVersionInfos (type perso contenant les propriétés ProductVersion, ProductName, OriginalFileName, InternalName, FileVersion, FileDescription, Copyright et CompanyName)


2) CLASSE FOLDER (objet dossier)
A. Méthodes

-RefreshInfos
-SetDates
-Crypt
-Decrypt
-Copy
-Delete
-Move
-MoveToTrash
-ShowPropertyBox
-Rename
-DoesFolderExist
-IsFolderAvailable
-Chang eAttributes
-GetIcon

B.Propriétés

-DriveName As String
-Path As String
-Drive As Drive
-DateCreated As String
-DateLastModified As String
-DateLastAccessed As String
-Attributes As FileAttributes
-IsHidden As Boolean
-IsArchive As Boolean
-IsCompressed As Boolean
-IsReadOnly As Boolean
-IsSystem As Boolean
-IsNormal As Boolean
-ShortPath As String
-ParentFolderName As String


3) CLASSE DRIVE (objet disque logique)
A. Méthodes

-RefreshInfos
-SetVolumeLabel (change le label du disque)
-CreateIso (créé un fichier ISO depuis le disque)
-Sanitize (lance la sanitization du disque ATTENTION ==> C'EST LA DESTRUCTION IRREVERSIBLE DES DONNES DU DISQUE !)
-IsDriveAvailable
-ShowPropertyBox
-ReadDriveSt ring (lecture dans le disque, string de taille multiple de la taille d'un secteur)
-WriteDriveString (écriture dans le disque, string de taille multiple de la taille d'un secteur)
-GetIcon

B.Propriétés

-Cylinders As Currency
-TracksPerCylinder As Long
-SectorsPerTrack As Long
-PercentageFree As Double
-FreeSpace As Currency
-UsedSpace As Currency
-UsedClusters As Currency
-StartingOffset As Currency
-TotalSpace As Currency
-SectorPerCluster As Long
-BytesPerSector As Long
-FreeClusters As Long
-TotalClusters As Long
-TotalLogicalSectors As Currency
-TotalPhysicalSectors As Currency
-VolumeLetter As String
-BytesPerCluster As Long
-HiddenSectors As Long
-PartitionLength As Currency
-VolumeName As String
-VolumeSerialNumber As Long
-FileSystemName As String
-strMediaType As String
-DriveType As Byte
-strDriveType As String


4) CLASSE PHYSICALDISK (objet disque physique)
A. Méthodes

-RefreshInfos
-Sanitize (lance la sanitization du disque ATTENTION ==> C'EST LA DESTRUCTION IRREVERSIBLE DES DONNES DU DISQUE !)
-ReadPhysicalDiskString (lecture dans le disque, string de taille multiple de la taille d'un secteur)
-WritePhysicalDiskString (écriture dans le disque, string de taille multiple de la taille d'un secteur)

B.Propriétés

-Cylinders As Currency
-MediaType As MediaType
-TracksPerCylinder As Long
-SectorsPerTrack As Long
-TotalSpace As Currency
-BytesPerSector As Long
-TotalPhysicalSectors As Currency
-strMediaType As String
-DiskName As String
-DiskNumber As Byte


5) CLASSE FILESYSTEM (équivalent de FileSystemObjet, toutes les fonctions sont là)

A.Méthodes

-BrowseForFolder (boite de dialogue choix de dossier)
-ChangeFileAttributes
-CompareFiles (comapraison de fichiers)
-CopyFile
-CopyFolder
-CreateEmptyFile (création d'un fichier vide)
-CreateFolder
-CreateIsoFromDrive
-CutFile (découpage de fichier)
-DecryptFile
-DecryptFolder
-DeleteEmptyF older
-DeleteFile
-DownloadFile
-DriveExists
-Encr yptFile
-EncryptFolder
(tout ce qui commence par Enum... sert à énumérer des objets.
Pour les différences entre ces méthodes, voir l'exemple dans le zip)
-EnumDrives
-EnumDrivesStr
-EnumFiles
-EnumFi lesStr
-EnumFolders
-EnumFoldersStr
-EnumPhysicalD isks
-EnumPhysicalDisksStr
-FileExists
-FolderExis ts
-FusionFiles (fusion de fichiers)
-GetAssociatedProgram
-GetDrive (récupère un objet Drive)
-GetDriveGeometry (infos sur la géométrie du disque logique)
-GetDriveName
-GetDriveSize (infos sur les tailles)
-GetDriveType
-GetDriveVolumeInfo (infos sur le volume)
-GetFile (récupère un objet File)
-GetFileAttributes
-GetFileDateAsCurrency
-G etFileDates (récupère les 3 dates)
-GetFileExtenion
-GetFileName
-GetFileSize
-GetCompressedFileSize
-GetFileType
-GetFileVersio nInfos (infos sur les copyright, versions... des *.exe, *.ocx, *.dll...)
-GetFolder (récupère un objet Folder)
-GetFolderAttributes
-GetFolderDateAsCurre ncy
-GetFolderDates
-GetFolderName
-GetIcon (icone d'un fichier, disque, dossier)
-GetParentFolderName
-GetPhysicalDisk (récupère un objet PhysicalDisk)
-GetPhysicalDiskGeometry
-GetPhysica lDiskName
-GetShortName
-GetShortPath
-GetSpecialF older (récupère un path de dossier spécial de windows)
-GetTempName (récupère un nom de fichier temporaire valide)
-IsDriveAvailable
-IsFileAvailable
-IsFold erAvailable
-IsPhysicalDiskAvailable
-IsRoot
-Move File
-MoveFolder
-MoveToTrash
-ReadDriveString
-Re adFileString
-ReadPhysicalDiskString
-Rename
-Sani tizeFile
-SanitizeDisk
-SanitizePhysicalDisk
-Save DataInFile (sauvegarde d'une string dans la suite d'un fichier)
Voir l'exemple dans le zip pour les 4 fonctions de recherche
-SearchForFiles
-SearchForFilesStr
-Sear chForFolders
-SearchForFoldersStr
-SetFileDates
-S etFolderDates
-SetVolumeLabel
-ShellOpenFile (ouverture d'un fichier avec le prog associé)
-ShowDriveProperty
-ShowFileProperty
-Sho wFolderProperty
-ShowOpen (boite de dialogue Ouvrir, support de la multisélection)
-ShowRunBox (boite de dialogue démarrer)
-ShowSave (boite de dialogue sauvegarder)
-WriteDriveString
-WriteFileString
-W ritePhysicalDiskString

B.Propriétés

-Drives (collection des lecteurs existants)
-NumberOfPhysicalDisks
-PhysicalDisks (collection des disques physiques existants)





NOTES QUANT A CE CODE :

-il a pour but d'être exaustif au maximum ==> si vous avez des idées de nouvelles fonctions, SVP donnez les moi !
-il a pour but d'être performant ==> ce n'est pas totalement le cas, notamment pour l'obtention des infos sur les disques physiques. De même, l'organisation des classes objets peut, je pense, être simplifiée et améliorée. SVP des commentaires constructifs pour optimiser grandement tout çà !




Ce code sera inclus (quand complet, débugué et performant) dans la VbSystemLibrary disponible ici : http://vbsystemlibrary.free.fr/

Source

  • 'tout dans le zip, ULTRA commenté comme d'habitude ;)
  • 'pour la recherche, voir le zip pour l'exemple
'tout dans le zip, ULTRA commenté comme d'habitude ;)

'pour la recherche, voir le zip pour l'exemple

 Conclusion

SVP ^^ :

-si vous avez des idées de nouvelles fonctions, proposez les TOUTES ^^
-commentez et notez svp ;)

Et le plus important ==> Si vous avez LA MOINDRE IDEE POUR OPTIMISER CE CODE, merci d'en m'en faire part !


Merci à tous, @+



/!\    http://vbsystemlibrary.free.fr/    /!\

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

24 avril 2007 14:46:49 :
Grosses optimisations O_o
24 avril 2007 15:11:52 :
Suppression des enums doublons, suppression de la classe inutile, correction d'un bug horrible
24 avril 2007 16:03:03 :
Deleted useless reference to scrrun.dll + fixed little bug
24 avril 2007 16:08:38 :
Supprimé (encore) un bug (sur TotalLogicalSector de la classe Drive)
24 avril 2007 19:40:55 :
Ajout de nouvelles fonctions
24 avril 2007 19:43:55 :
Updated description
27 avril 2007 21:37:36 :
Ajouté plein de nouvelles fonctions + supprimé 1 bug qui empechait de récupérer les infos de la classe PhysicalDisk
27 avril 2007 21:44:39 :
Updated description
28 avril 2007 09:03:47 :
Avais oublié le fichier exemple
28 avril 2007 09:07:18 :
Remis l'exemple
28 avril 2007 16:08:22 :
Ajouté la recherche + quelques optimisations
28 avril 2007 16:12:43 :
Petit bug...
29 avril 2007 00:44:45 :
Avais oublié de décommenter certaines instructions + rajouté la proc par défaut pour deux classes
29 avril 2007 19:52:23 :
Enlevé un bug qui empechait de récupérer les bonnes infos sur les drives

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) UTILITAIRE DE SANITIZATION DES DISQUES DURS/FICHIERS (SUPPRE...
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLE SHUTDOWN SCHEDULER : ARRÊTS PLANIFIÉS (LOCAL OU REMOT...
Source avec Zip Source .NET (Dotnet) COMMENT DÉMARRER UN PROCESSUS SUR PC DISTANT DE MANIÈRE CACH...
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR
Source avec Zip Source avec une capture Source .NET (Dotnet) COMMENT DÉTECTER LES PROCESSUS CACHÉS (VIRUS, ROOTKITS...) +...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) MODIFIER LES EXTENSION DES FICHIERS par okosa
ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICH... par kerisolde
Source avec Zip Source avec une capture FILE,SECURITY,FICHIER par okosa
Source avec Zip Source avec une capture Source .NET (Dotnet) PATCHEUR DE FICHIER par tototh
Source avec Zip Source avec une capture LECTURE DES INFORMATIONS DES DISQUES COMPOSANT UN ENSEMBLE R... par jack

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) RENOMMER TOUS LES FICHIERS D'UN DOSSIER PAR CLIC DROIT par Le Pivert
Source avec Zip Source avec une capture Source .NET (Dotnet) RENOMMER FICHIERS MASSIVEMENT par aus3004
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILITAIRE DE SANITIZATION DES DISQUES DURS/FICHIERS (SUPPRE... par violent_ken
Source avec Zip Source avec une capture Source .NET (Dotnet) SYNCHRONISE FICHIERS CLÉ AVEC LE PC par alosamoelle
Source avec Zip Source avec une capture EXPLORATEUR DE DOSSIER EN VB6 par TomIlliev

Commentaires et avis

Commentaire de violent_ken le 22/04/2007 15:12:40

Je sais que c'est pas vraiment optimisé...


Donc si vous avez LA MOINDRE IDEE POUR OPTIMISER CE CODE, merci d'en m'en faire part !

Merci, @+ ;)

Commentaire de MadM@tt le 22/04/2007 15:50:26

Vraiment excellent comme code, c'est un truc de bourrin de recoder tout ça lol.
Sinon il faut pas se fier à l'aperçu du contenu du zip, chez moi il affiche que la dll mais en téléchargant on tombe bien sur le zip complet

Commentaire de violent_ken le 22/04/2007 16:01:36

C'est vrai que c'était assez long... ;)



Enfin le problème c'est que ce n'est pas assez rapide.
L'appel à GetDrive() pour mon HDD contenant Windows met... 1.5 secondes !!
Bon ok, toutes les infos sont récupérées mais quand même, ce temps est énorme !

De même pour les fichiers, 500 fois GetFile() met quand même 800 ms... beaucoup plus que FSO.


Y a moyen d'optimiser en ne récupérant qu'une seule fois le handle des objets, mais par contre faudrait mettre plusieurs fonctions/APIs/ENUM dans les objets...

@+

Commentaire de violent_ken le 22/04/2007 16:04:16

D'ailleurs au passage : tu as vu sur le screenshot le temps mis par For Each In ?

Carrément plus rapide comme méthode...
@+

Commentaire de MadM@tt le 22/04/2007 17:17:17

Nooonn à ce point la ! Effectivement c'est bien mieux avec for each

Commentaire de EBArtSoft le 22/04/2007 21:17:18 administrateur CS

sympa :)

Commentaire de violent_ken le 23/04/2007 17:48:38

thx EB ;) (si tu as des idées pour optimiser la vitesse...^^)


J'ai refait quelques tests : GetDrive ne met aujourd'hui plus que 200ms... je vois pas du tout pourquoi hier c'était 1500 ??

Et de plus, quand on fait un GetFile, un GetDrive ou un GetFolder avec FSO, AUCUNE info n'est récupérée...c'est quand on fait GetFile().PROPERTY que l'info est récupérée !

Donc normal que ce soit beaucoup plus rapide...puisque çà ne récupère pas d'infos !!



Je vais faire des benchs comparatifs réels d'obtention d'infos entre FSO et cette source.

@+

Commentaire de MadM@tt le 23/04/2007 17:53:11

lol ah oui ok
Mais c'est mieux comme ça, car si tu accède 2 fois de suite à la propriété il la met à jour 2 fois c'est bete, et en plus c'est une propriété, pas une fonction, donc une propriété dans la logique, c'est qqch de fixe que l'ont récupère, alors que la fonction sous-entend un traitement pour la trouver (enfin c'est comme ça que je voit les choses du haut de ma chaise), mais y'a surement d'autres points de vue ^^
Sinon effectivement 200 ms c'est mieux que 1,5s

Commentaire de violent_ken le 23/04/2007 17:58:31

Ah bah bravo FSO....


Je viens faire le test de récupération des infos sur un fichier avec FSO vs cette source...

Pour la récupération de 500*22 infos, ma source est plus rapide de 50%... Et en plus, quand on fait .GetFile avec cette source, on récupère BEAUCOUP PLUS d'infos qu'avec le GetFile de FSO....

Autrement dit cette source est vraiment plus rapide, même si effectivement un bête ".GetFile().Size" sera plus rapide avec FSO (car ne récupère que la Size avec FSO, et récupère tout avec ma source).


Pas sur d'être très clair...


Je fait les tests avec les classes Drive et Folder...

@+

Commentaire de violent_ken le 23/04/2007 18:06:47

C'est bon, je suis rassuré...

En faisant 500 fois :

FSO.GetFile().Size
FSO.GetFile().DateCreated
.... (10 infos)

et

maclasse.GetFileSizes().FileSize
maclasse.GetFileDates.DateCreated
.... (10 infos)


ma classe est TROIS FOIS plus rapide que FSO.




En conclusion :
- cette source est bien plus rapide que FSO
- si on veut récupérer qu'une info (exemple les attributs), on fera "maclasse.GetFileAttributes(file)" et non "maclasse.GetFile(file).Attributes" (qui récupère toutes les infos)
- si on veut récupérer toutes les infos sur un fichier, on fera "set cFile=maclasse.GetFile(file) puis info=cFile.PROPERTY"...etc


Je vérifie que c'est pareil avec les classes Folder et Drive...
@+

Commentaire de violent_ken le 23/04/2007 18:20:56

Cette source récupère des infos 50% plus vite que FSO sur les dossiers !


Par contre elle est beaucoup, beaucoup plus lente sur les accès aux infos sur les disques... Je vais essayer de réparer un peu çà en ne récupérant qu'une seule fois le handle avec CreateFile.

Mais je crains que l'écart de temps sur les disques demeure vraiment élevé...

@+

Commentaire de MadM@tt le 23/04/2007 18:24:23

Si si c'est très clair, et c'est super d'avoir laissé la possibilité de récupérer qu'une seule info, ce qui fait bien sur gagner du temps.

Commentaire de violent_ken le 23/04/2007 18:33:54

Ah oups, j'avais pas vu ton msg entre les miens ^^

Effectivement, c'est plus logique que les properties ne récupèrent pas elles-même les infos (enfin je crois) ! Laissons çà aux functions ^^


Par contre, gros problème encore avec les Drives/Disks. J'espère que c'est l'appel à CreateFile() pour récupérer le handle du drive qui est très lent, parce que sinon je vois pas trop comment optimiser...



A ton avis, est ce grave d'avoir un handle du disque "ouvert" durant toute la vie d'une variable de type Drive ou PhysicalDisk ??
Parce si c'est pas grave, je récupère une seule fois le handle dans le Class_Initialize du Drive/PhysicalDisk, je le stocke en private (et éventuellement je le propose en Property Get) et ensuite j'appelle des fonctions déclarées en Friend dans FileSystem avec comme paramètre le handle du disque ==> gain de 5 ou 6 appel à l'API CreateFile par GetDrive.

A ton avis, c'est une bonne idée ou pas ??

@+

Commentaire de EBArtSoft le 23/04/2007 18:55:05 administrateur CS

attention a ne pas trop stocker ! car si on insert un disque amovible la classe ne le detecte plus...

:p

Commentaire de violent_ken le 23/04/2007 19:02:40

"attention a ne pas trop stocker ! car si on insert un disque amovible la classe ne le detecte plus..." ==> J'avoue que j'ai pas trop saisi ??

@+

Commentaire de EBArtSoft le 23/04/2007 19:06:09 administrateur CS

haha laisse tomber je suis hors limite, Cerveau overflow !

Non je voulais dire que si tu temporise toute les variables pour accelerer l'acces aux proprietes tu va te retrouver avec des disque qui n'existe plus. Je prends comme exemple une clef usb que l'on retire

:p

Commentaire de violent_ken le 23/04/2007 19:10:20

Ah ok, effectivement !


Alors le meilleur compromis serait-il de faire :
- CreateFile une fois lors du RefreshInfos de la classe Drive
- récupérer les infos par des fonctions Friend de FileSystem avec le handle en param
- CloseHandle à la fin de la sub RefreshInfo
?


Autre chose pendant que je t'ai sous la main ^^ ==> sais tu comment cacher la classe clsDef pour le projet utilisant la dll ?

Merci, @+

Commentaire de EBArtSoft le 23/04/2007 19:41:45 administrateur CS

Le mieu c'est de la placer en mode instancing "private" puis tu l'utilises normallement dans les procedure interne a ta dll puis en type "object" lorsque que exporte une procedure (c'est totalement invisible mais accessible via idispatch).

Commentaire de violent_ken le 23/04/2007 19:55:57

En fait, cette classe contient les types et les enums publics... donc pas moyen de la mettre en private !

@+

Commentaire de EBArtSoft le 23/04/2007 19:58:56 administrateur CS

ya que ça dedans ?
bah crée une typlib ! ou ajoute les enum dans une autre classe...

Commentaire de violent_ken le 23/04/2007 20:45:04

Ok, je me renseigne sur les typelibs ;)
Merci, @+

Commentaire de violent_ken le 24/04/2007 14:56:24

Voilà la MAJ 1 qui règle les problèmes d'optimisations de manière assez bonne :

Par rapport à la précédente version :
- gain sur la fonction GetFile : 10% de temps en moins
- gain sur la fonction GetPhysicalDisk : 30 % de temps en moins
- gain sur la fonction GetFolder : 40 % de temps en moins
- gain sur la fonction GetDrive : 80% de temps en moins (oui je sais... !!)

Par contre j'ai du rajouter 600 lignes de code...


J'ai aussi changé la fonction GetLargeInteger et l'est remplacée par une version avec CopyMemory que m'a fournie Galain ==> elle est trois fois plus rapide qu'avant.

J'ai aussi rajouté un CloseHandle qui manquait dans GetPhysicalDiskName.



Voilà, çà commence a être vraiment rapide !
@+ (je regarde les typelibs)

Commentaire de violent_ken le 24/04/2007 15:14:14

MAJ 2 :

- suppression de certains enum en double
- suppression de la classe clsDef qui était VRAIMENT inutile
- suppression des déclarations de constantes et de variables inutiles
- suppression d'un bug énorme dans GetDriveVolumeInformation_HANDLE ==> retour à la version son _HANDLE ==> "seulement" un gain de 65% de temps par rapport à la version 1


@+

Commentaire de violent_ken le 24/04/2007 15:17:47

(version *non _HANDLE)

Commentaire de Renfield le 24/04/2007 15:51:37 administrateur CS

Pas simple a compiler l'exe, la scripting runtime est repassée au dessus de ta lib, dans les priorités... (merci vb^^)



Commentaire de violent_ken le 24/04/2007 15:54:04

Mince ! J'ai laissé la référence à scripting pour mes benchs...

Je change çà de suite !
@+

Commentaire de violent_ken le 24/04/2007 16:03:59

Voilà c'est bon, plus de référence douteuse à Scripting et en même temps j'ai viré un bug sur strDriveType/DriveType de la classe Drive.

@+

Commentaire de violent_ken le 24/04/2007 19:42:06

Ajouté les fonctions :

- EncryptFile
- EncryptFolder
- DecryptFile
- DecryptFolder
- DownloadFile

@+

Commentaire de us_30 le 24/04/2007 21:38:34

Bonsoir,

Impresionnant ! Je regarderai en détail ce week-end. Bravo 10/10 !

Amicalement,
Us.

Commentaire de EBArtSoft le 24/04/2007 22:15:44 administrateur CS

C'est toujours le meme dilemene :

Je veux que ce soit rapide !

ou

Je veux que ce soit petit !

Enncore une fois je le redis... sympa :p

Commentaire de MadM@tt le 24/04/2007 22:25:11

Tain le boulot fournit est balèze !

Pour les fonctions d'encryption tu utilise quel système de cryptage ?

Commentaire de violent_ken le 24/04/2007 22:50:11

us_30 ==> Merci ;)

EB ==> Bah, l'important c'est que çà tourne vite ^^ D'ailleurs avec le CreateFile unique, c'est plutôt pas trop mal (en tout cas comparé à avant...)

Madm@tt ==> L'API EncryptFile/DecryptFile ^^
http://msdn2.microsoft.com/en-us/library/aa364021.aspx
C'est le cryptage fourni par Windows (clic droit dans explorer, propriétés, avancé, crypter).

Comme c'était pas vraiment le propos de cette source, j'ai fait (très) simple :p
Les 5 dernièrs fonctions ne sont que 5 appels à des APIs ;)

@+

Commentaire de us_30 le 24/04/2007 23:29:32

Re-salut à tous,

J'ai pas trop résisté, j'ai jetté un petit coup d'oeil, tout de même... Pour l'instant j'ai vu qu'une simple coquille dans info lecteur, pour le calcul en pourcentage de libre. Cela renvoi le pourcentage occupé à la place... ah ! -);

Sinon, en présentation tu demandes aussi des idées de fonction... Il me semble (sauf erreur) que tu n'as pas de fonction de recherche de fichier, de dossier, avec le critère nom ou avec le contenu, comme dans l'exploreur... voir avec n'importe quel critère (ou presque) par exemple, la date de création, d'accès, etc... enfin, bon on peut aller loin comme ça... voir en combinaison de critères (multi-critères). Exemple, avec la date de création et contenant tel info... Long programme...

Il y a pas longtemps, il me semble également que tu avais codé un "Broyeur de fichier", je ne crois pas l'avoir vu dedans. A rajouter si c'est bien le cas, enfin c'est une idée.
A noter, que j'avais fait également une fonction similaire (peut-être encore plus élaborée, mais qu'en VB donc beaucoup moins rapide) pour effacer toute trace d'un fichier, certes, mais il me sert après un cryptage de fichier. En effet, il est un peu bête de crypter un fichier, si sa forme non cryptée est seulement effacé par un simple DELETE... De plus, pour des fichiers déjà éffacés (delete), il est intéressant de pouvoir aussi "broyer" leurs traces. Donc, j'avais aussi codé un remplissage jusqu'à saturation du disque, (avant effacement). Après essai par plusieurs programmes de type FileRecovery, on peut constater qu'ils ne peuvent plus rien retrouver... donc, voici une idée... mais bon, c'est très spécifique, j'en conviens... De plus dans le volume où windows garde son fichier d'échange, on ne peut pas tout faire... voir si on peut faire mieux...

Voilà, déjà...
Amicalement,
Us.

PS : EBArtSoft : On peut aussi avoir petit et rapide...

Commentaire de EBArtSoft le 25/04/2007 00:28:09 administrateur CS

us_30> va dire ça a ma femme ! hahahah

Commentaire de violent_ken le 25/04/2007 13:06:33

EB ==> lol !!


Sinon, effectivement, la recherche de fichiers/dossiers n'est pas inclue, il n'y a qu'un listing des fichiers/dossiers qui est possible.
Pour l'utilitaire d'effacement des fichiers, j'avais pensé à l'inclure, mais je me suis dit que çà allourdirait quelque peu la classe pour une utilisation au finale assez rare.


Je vais y réfléchir, voir si c'est pas trop lourd à inclure, mais déjà merci pour ces propositions ! (et merci également pour avoir signalé le bug que je corrigerai ce soir).

@+

Commentaire de Galain le 26/04/2007 00:07:58

Salut Violent_Ken

Tu as écrit : "J'ai aussi changé la fonction GetLargeInteger et l'est remplacée par une version avec CopyMemory que m'a fournie Galain ==> elle est trois fois plus rapide qu'avant."
Ca c'est une bonne nouvelle

Mais on peut aller plus vite

Dans un module on déclare
Public Part32(0 to 1 ) as long  ' 2 Long 32 bits

ensuite inspire toi de ma Sub d'accès direct disque

Public Sub DirectReadWrite(ByVal iStartSec As Currency, ByVal nbytes As Long, accesrw As Byte)

' Attention le nombre d'octets lus ou écrits ainsi que l'offset du premier octet lu ou écrit
' doivent impérativement être un multiple de la taille d'un secteur de disque
' Istartsec et nbytes doivent être des multiples de 512 ( taille standard des secteurs des disques)

    Dim Bytesread As Long
    Dim Byteswrite As Long
    Dim ret As Long

    On Error GoTo dskerror

    dskerr = False
    If hDevice& <> 0 Then CloseHandle hDevice&
    'ouvre le drive
    hDevice& = CreateFile(ldrive$, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&)

    'quitte si le handle n'est pas valide
    If hDevice& = INVALID_HANDLE_VALUE Then dskerr = True: Exit Sub

    'move pointer
    pointeur = (CCur(iStartSec) / 10000) * CCur(BytesPerSector) ' VOIR NOTE
    
    ' transforme un Currency en 2 Long signés 32 bits
    CopyMemory Part32(0), pointeur, 8 ' Pointeur -----> Part32(0) et Part32(1)
    
    ret& = SetFilePointer(hDevice, Part32(0), Part32(1), FILE_BEGIN)
    If ret& = -1 Then GoTo dskerror

    Select Case accesrw
    Case 0    ' lecture

        'redimensionne les tableaux résultants
        ReDim readoctet(0 To nbytes& - 1)

        'appel l'API de lecture
        ret& = ReadFile(hDevice, readoctet(0), nbytes&, Bytesread&, 0&)
        If ret& = 0 Then GoTo dskerror

    Case 1    ' écriture

        ' verrouilage de la zone du disque à écrire
        Call LockFile(hDevice&, Part32(0), Part32(1), nbytes&, 0)

        ' écriture disque
        ret& = WriteFile(hDevice&, writeoctet(0), nbytes&, Byteswrite&, 0)

        ' on vide les buffers internes et on dévérouille la zone
        Call FlushFileBuffers(hDevice&)
        Call UnlockFile(hDevice&, Part32(0), Part32(1), nbytes&, 0)

    End Select

    'ferme le handle
    CloseHandle hDevice
    Exit Sub

dskerror:
    dskerr = True
    CloseHandle hDevice

End Sub


Ainsi on évite 2 Copymemory et j'espère que le temps gagné n'est pas gaché par l'accès à 2 variables tableau
Autre chose : Garder la syntaxe de la ligne car ainsi on multiplie l'étendue des secteurs accessibles
Soit P = Pointeur et B = Bytespersector

En faisant (P/10000) * B au de (P*B)/10000 on multiplie l'étendue des secteurs accessibles par B : on divise d'abord et on multiplie ensuite
Mais les limites du type Currency sont encore loin d'être atteinte : il nous faudrait des disques durs énormes pour les dépasser (922 337 203 685 477 octets pour être précis : valeur entière max d'un Currency positif)

A + et bravo pour tes codes

Commentaire de violent_ken le 26/04/2007 20:53:40

Ah oui, je vois l'optimisation, c'est sur que l'on y gagne (car plus d'appel à une Function et donc pas d'attribution des valeurs aux param en byref).

"En faisant (P/10000) * B au de (P*B)/10000 on multiplie..." ==> exact... j'essaie de le prendre en compte dans mes codes pour éviter l'overflow, c'est une erreur de ne pas l'avoir mis !

Merci pour ce commentaire constructif.
Je vais faire une MAJ ce soir je pense (correction de bugs, optimisations et ajout de nouvelles fonctions).

us_30 ==> Finalement je ne mettrais pas la sanitization, car trop lourd à mon gout (ASM de EB...etc).

@+

Commentaire de violent_ken le 26/04/2007 20:56:51

Mais j'y pense... pas besoin de diviser par 10000 dans le code ?

Perso, j'ai :    Pointeur = CCur(StartingSector) * CCur(BytesPerSector)

@+

Commentaire de violent_ken le 26/04/2007 20:58:40

Erf, je suis trop bête...

Dsl pour ce triple post...
@+

Commentaire de EBArtSoft le 26/04/2007 21:00:38 administrateur CS

Comment ça trop lourd lol, ma classe fait tout juste 120 lignes !!
J'en connais ils font des convertisseurs euro/franc avec 10x plus de code :p

Surtout pour un "FileSystem", moi je l'ajouterais...

Commentaire de violent_ken le 26/04/2007 21:08:44

lol ;) C'est pas la taille le problème^^

C'est entre autres le fait qu'il faille rajouter une classe (que d'ailleurs je ne sais pas masquer pour l'utilisateur !) et quelques centaines de lignes pour la sanitization, les fonctions Friend prenant un param un pointeur...etc.

Puis "la" grosse question est : est-ce raisonnable de mettre ce bout de code somme toutes dangereux et d'une utilisation relativement rare dans une library qui a pour objectif de remplacer FSO "au quotidien" (enfin perso :p) ??


Peut être que oui en fait...je sais pas trop...

En disant "moi je l'ajouterais...." tu vas finir par me le faire mettre dedans ! lol

@+

Commentaire de violent_ken le 26/04/2007 21:09:57

Ou alors va falloir alléger tout çà pour la VbSystemLibrary.
@+ (désolé pour le double post, vade retro tabulation)

Commentaire de Galain le 26/04/2007 21:19:36

Salut à tous

Pour Violent_Ken la valeur 1 en Currency est représentée sur 64 bits par la valeur 10000 équivalente en binaire : donc il faut diviser par 10000 pour retrouver la valeur binaire correcte 1 sur 64 bits et ensuite on multiplie cette valeur par Bytespersector pour avoir le pointeur sur le premier octet à lire ou écrire  

Pour Eb : d'accord avec toi je l'ajouterai; cela ne mange pas de pain

A+ les gars

Commentaire de violent_ken le 26/04/2007 21:21:38

Galain ==> oui, oui, j'ai lu trop vite mon code ^^ Tout à fait vrai.


Mais personne ne trouve dangereux de mettre la méthode "Sanitize" dans un objet Drive, PhysicalDisk ou File ????

@+

Commentaire de EBArtSoft le 26/04/2007 21:26:36 administrateur CS

C'est simple un bibliotheque de fonction sa sert a quoi ? Ca sert a etre simple et surtout exaustif ! Sinon autant ce taper des lignes de code et virer la lib ! Maintenant c'est dangereu alors je le met pas... dans ce cas la autant enlever toute les fonctions de vb car suffit d'utiliser "shell","kill" voir simplement New pour flinguer windows. Ce n'est donc pas la fonction qui est dangereuse mais la personne qui l'utilise. Enfin bref si c'est la "taille" ou la "complexite" d'un code qui te fait peur tu ne metras jamais rien de bien dans ta lib, ce qui fait la difference avec les autres lib pourri que personne ne telecharge telement il y en a des floppé c'est justement le fait qu'elle offre des fonction et des possibilites que les autres n'ont pas alors va y petit !!

hahah faut que j'arrete la coke :p

Commentaire de violent_ken le 26/04/2007 21:31:16

Ok c'est bon j'y vais ^^

Mais faudra pas se plaindre si quelqu'un fait
Call FS.GetDrive("C").Sanitize :p


Au passage : sais tu comment cacher ta classe pour éviter que l'utilisateur la voit dans la liste de l'autocomplétion ?

Et pendant que j'y suis (^_^), quel est l'intérêt profond de définir une "Procédure par défaut" (mis à part pour le flemmard qui veut pas tapper ".Path") ??

@+ (donc pas de MAJ ce soir, mais demain !)

Commentaire de EBArtSoft le 26/04/2007 21:33:17 administrateur CS

classe->propriete->instancing->private

Commentaire de Galain le 26/04/2007 21:33:37

J'ai mis un 10/10 pour Violent_Ken et je te mettrais un 11/10 si il rajoute "Sanitize" !!!!!!!!!!!

Commentaire de EBArtSoft le 26/04/2007 21:35:30 administrateur CS

Reponse question 2 : Voila ta compris !

Me dit pas que t'as jamais fait :

mavar = TextBox1

:p

Commentaire de violent_ken le 26/04/2007 21:38:14

EB ==> ok pour le private.

lol pour "mavar = TextBox1" ;) Bien sur je l'ai déjà fait ^^ Mais c'est tellement laid que j'ai arrêté :p


Bon donc dans mon élan de folie, je rajoute la recherche multi-critères ??
(si oui, je suppose qu'il faut prévoir en param l'adresse d'une fonction de callback pour la progression ?)

Et je proposerai même les properties de date en écriture... puisqu'il faut être complet...


@+ (et merci Galain !!)

Commentaire de EBArtSoft le 26/04/2007 21:42:52 administrateur CS

un pointeur de fonction ???? en vb ???? mais naaaan une interface et puis c'est bon ! regarde directx il a compris lui :p

Commentaire de violent_ken le 26/04/2007 21:49:17

moi pas programmer directx !

Mais quel est le problème avec le pointeur de fonction ? Ok c'est limité au VB6 (pas antérieur) avec AddressOf, mais çà tourne bien (comme CopyFileEx par exemple).


Cela étant, j'avoue que l'interface me semble carrément mieux ! Je vais en plus pouvoir mettre en application ce que m'a appris Renfield !

@+

Commentaire de violent_ken le 26/04/2007 21:57:35

Ma dernière question et puis j'arrête de flooder :p

Devrais-je ajouter des fonctions du genre :
-découpage/fusion de fichier
-création d'un fichier ISO depuis un lecteur CD/DVD
-comparaison de fichiers
-...etc

?
@+

Commentaire de EBArtSoft le 26/04/2007 22:03:10 administrateur CS

Un callback sur pointeur c'est tres rapide, mais c'est une methode typiquement "C" qui peut planter l'application et l'ide. Hors le principe du vb c'est justement d'eviter ça et d'offrir au programmeur une couche de controle d'acces a la memoire. Donc partant du principe qu'une lib n'est pas destiné a celui qui la crée mais a tout ceux qui vont l'utiliser autant penser comme un "vébiste" de base c'est a dire "A bah moi je veux que ce soit simple et que j'ai pas besoin de 15 tonne de code pour faire la petite application que mon boss ma demandé"

Bref, j'arrete la sinon je vais m'auto-stresser.

Papa Renfield s'il vous plait :p

Commentaire de violent_ken le 26/04/2007 22:08:55

Papa Renfield, c'est vrai ^^

Sinon t'as raison, une interface sera beaucoup plus "sure" pour l'user. Bien que probablement plus lente ?

@+

Commentaire de EBArtSoft le 26/04/2007 22:19:37 administrateur CS

Pas probablement... surement !

Commentaire de violent_ken le 26/04/2007 22:22:31

Erf ! Faudrait pas que ce soit le jour et la nuit quand même... paske si on appelle la procédure à chaque fichier trouvé, ou bien tout les 500 fichier scannés, çà va faire beaucoup de temps perdu  !

Et au fait, devrais-je de ton avis ajouter les autres fonctions citées précédemment ?
@+

Commentaire de EBArtSoft le 26/04/2007 22:42:14 administrateur CS

tout ce qui tourne autour du filesysteme doit etre ajouté apres une fois que t'aura un gros gros gros paquet de code bien compact... t'optimises. Une fois optimisé... tu ajoutes et ainsi de suite :p

Commentaire de violent_ken le 26/04/2007 22:50:01

Ok j'ajouterais tout...

Demain çà va coder sec ^^ (je vois déjà les 5000 lignes dans FileSystem.cls)
@+

Commentaire de violent_ken le 27/04/2007 21:43:18

Salut, en voilà une MAJ qu'elle est grosse...


Au menu :

1) suppression d'un tout petit bug qui empechait de récupérer
les infos de la classe PhysicalDisk

2) Changé la langue (c'est de l'anglais dans l'exemple, paske j'ai posté également cette source sur un site anglais)

3) Ajout de nombreuses fonctions, à savoir :


Dans FileSystem :
-FusionFiles (fusion de fichier découpés)
-CutFile (découpage de fichier)
-SetFileDates (pour changer les dates d'un fichier)
-SetFolderDates
-SetVolumeLabel (changer le label d'un disque)
-SanitizeFile
-SanitizeDrive
-SanitizePhysicalDisk
-CompareFiles (compare 2 fichiers)
-CreateIsoFromDrive (créé un fichier ISO depuis un disque)

Dans File :
-SetDates
-DriveName
-FolderName
-Sanitize
-CutFile

Dans Drive :
-Sanitize
-SetVolumeLabel
-CreateIso

Dans PhysicalDrive :
-Sanitize



Je n'ai pu tester SanitizeDrive et SanitizePhysicalDisk (la dernière est d'ailleurs nouvelle) car pas de disque sous la main, si quelqu'un pouvait confirmer le bon fonctionnement...

Merci, @+

Commentaire de violent_ken le 27/04/2007 21:47:41

Oui j'oubliais : j'ai ajouté aussi les propriétés FolderName (dans File) et DriveName (dans File et Folder).

Autre chose, j'ai oublié de remercier EB pour sa classe avec le code ASM dedans ^^

Encore une chose, j'ai laissé les déclarations des fonctions Search... dans FileSystem, elles ne sont pas faites, mais c'est prévu.


Dernière chose ==> je compte mettre plus tard (quand j'aurais le courage :p) la description de chaque fonction dans les attributs de procédure.
La question étant : en anglais ou en français ??


Enjoy, @+

Commentaire de MadM@tt le 28/04/2007 02:40:51

Ah je viens de télécharger le zip et il n'y a pas le projet d'exemple

Pour la description de chaque fonction, je pense que si tu peux le faire, l'anglais est la meilleure solution, mais ça n'engage que moi ^^

Commentaire de Renfield le 28/04/2007 06:46:14 administrateur CS

idem, en british sera plus aisément distribuable

Commentaire de violent_ken le 28/04/2007 09:10:46

Ok pour l'anglais ^^

Sinon, j'ai remis un *.zip avec l'exemple.
@+

Commentaire de EBArtSoft le 28/04/2007 11:58:04 administrateur CS

Ahhhh bah ça commence à être interressant cette histoire :p

Commentaire de violent_ken le 28/04/2007 13:02:24

J'attaque l'interface - grâce au tuto de Renfield - pour la recherche, en ce moment.

J'ai juste une question : suis-je obligé de passer en paramètre de ma fonction de recherche la form qui implémente l'interface ?

(je suis pas encore trop à l'aise avec les interfaces)

Merci, @+

Commentaire de draluorg le 28/04/2007 13:10:28

Salut a tous,

J'ai enfin trouvé le temps de jetter un oeil a ta big class ^^
Bravo pour le fameux boulot!

Sinon cote optimisation j'ai vu des ptites choses du genre:
Do While hDrive <> INVALID_HANDLE_VALUE
         hDrive = CreateFile....      
        If hDrive <> INVALID_HANDLE_VALUE Then
            Call EnumPhysicalDisks....
        End If
Loop

Pourquoi ne pas faire directement
Do

    hDrive = CreateFile....      
    If hDrive = INVALID_HANDLE_VALUE Then exit do
    Call EnumPhysicalDisks....
loop

Bon je chipote je te l'accorde!

Autre point mais je ne suis pas sur a ce niveau la..
Quand dans une classe genre ClsFolder tu appel clsFile.kelkeschoses ca instance a chaque fois une nouvelle classe non ?
Si oui tu peux peut etre instancier une ClsFile dans le Class_Initialize et la supprimer dans le Class_Terminate et utiliser toujours celle la dans ta clsFolder... (perso c'est ce que je fais mais je sais pas si ca change grand choses)

Sinon je dirais aussi de faire une Tlb au moins pour les api les plus appelés.

En tout cas ta classe est vraiment sympa encore bravo!

++

Commentaire de violent_ken le 28/04/2007 13:19:38

Salut, merci pour ce commentaire :

- "Do While hDrive <> INVALID_HANDLE_VALUE" ==> En fait, je viens de tester, il s'avère que l'on sort de la boucle lors du Loop, si la condition n'est plus vérifiée.
Donc si jamais hDrive=-1, il y aura une appel à EnumPhysicalDisks avant de sortir de la boucle...enfin il me semble


-"Si oui tu peux peut etre instancier une ClsFile dans le Class_Initialize et la supprimer dans le Class_Terminate et utiliser toujours celle la dans ta clsFolder... (perso c'est ce que je fais mais je sais pas si ca change grand choses)" ==> C'est très précisémment ce que j'ai fait dans toutes les classes objet ,je n'instancie que lors du Initialize() et libère lors du Terminate().


Pour la Tlb, j'avoue que je ne comprend pas suffisement le concept pour effectuer cette modification, du moins pour l'instant ^^ Si cela gagne beaucoup en perf, je vais m'y intéresser sérieusement... ;)

@+

Commentaire de draluorg le 28/04/2007 14:08:53

Oup's sorry autant pour moi j'avais pas vu que tu instanciais tes classes dans le Class_initialize!

Sinon pour le Do While oui en effet de cette facons tu es obligé de reverifier a chaque boucle! donc c'est pour ca que je dis autant ne pas mettre de while et sortir de la boucle des qu'on a un INVALID_HANDLE_VALUE...

Pour la tlb c'est un peu comme les #include en C/C++ mais bon je vais pas m'etendre sur ce sujet que je connais aussi tres peu!
En gros les avantages sont:
Jusqu'a 15 de gains sur l'APPEL a une fonction
Tes déclares ne sont pas dans ton projets mais dans un fichier de reference (fichier qui sera compiler avec le projet donc pas besoin de le distribuer avec ton exe)
Eb et RenField ont chacun déposé une source qui permet de les generer et pourront mieux t'expliquer que moi

++

Commentaire de Galain le 28/04/2007 14:09:36

salut Violent_Ken
Bravo pour cette classe mais 3 petites remarques
1° Attributs = 32 n'est pas très parlant : il faudrait trouver une astuce pour détailler ces attributs de façon pour clair
2° FileCompressedSize : oui mais ne devrait apparaître que seulement si le fichier est compressé et le positionner dans la liste après FileSize
3) FirstSector : je ne comprends pas la signification de ce paramètre disque

Mais va-s'y doucement : les touches de ton clavier doivent sûrement commencer à chauffer

A+

Commentaire de violent_ken le 28/04/2007 14:20:38

Salut,

Seb ==> Exit Do, yep, bonne idée. Pour les tlb, je regarderai ! Si on gagne beaucoup de temps lors des appels aux APIs, çà peut valloir le coup de changer.

Galain ==>
-Attributs, pour GetFileAtributes ? Ok, je passerais cette variable de type FileAttributes (un enum plus explicite)
-FileCompressedSize ==> En fait, je pense que le mieux serait de décomposer GetFileSizes en GetFileSize et GetCompressedFileSize ==> évite tous les problèmes
-FirstSector ==> ok ;) C'est un exemple de lecture du premier secteur du disque. Mais comme il y a généralement des &h0 dans le début du disque (qui "coupent" la string), la textbox n'affiche que 2/3 caractères...

@+

Commentaire de violent_ken le 28/04/2007 14:21:52

Seb ==> je viens de me rendre compte que j'avais mal lu ta remarque quand j'ai répondu pour le Loop la première fois (pas vu le Exit Do).
Tu avais évidemment raison.

@+

Commentaire de violent_ken le 28/04/2007 16:21:26

Cà y est c'est bon...


Au programme de cette MAJ :

- ajout des fonctions GetFolderDateAsCurrency et GetFileDateAsCurrency
- ajout de la recherche de fichiers/dossiers multicritères.

Les critères possibles sont : taille, nom, dates (les 3).


Il faut remplir un type perso pour personnaliser sa recherche.
J'ai implémenté une interface pour la recherche ==> il existe deux "events", ItemFound et SearchIsFinished.

Pour en bénéficier, il faut mettre "Implements ISearchEvent" dans le code de la form...



Voilà un exemple de définition des critère de recherche (avec lancement de la recherche en récupérant un objet, avec l'utilisation de l'interface) :

    With MySearch
        .Criteria = SearchName + SearchSize + SearchDateLastAccessed
        .DateLastAccessedOperator = [ <= ]
        .DateLastAccessedValue = "24/04/2007 17:45:12"
        .SearchName = ".exe"
        .SizeOperator = [ > ]
        .SizeValue = 50000
        .RespectCase = True
        .SubFolder = True
        .FolderName = "C:\Program Files"
    End With
    
    Call FS.SearchForFiles(MySearch, True, Me)


La méthode de recherche est :
1) récupération de tous les fichiers (ou dossiers) avec un enum
2) test de chaque fichier (ou dossier) avec les critères ==> valide ou pas le fichier (ou dossier)


Galain ==> les attributs sont déjà définis en une classe. 32 est affiché dans la textbox, mais dans l'IDE, l'autocomplétion de propose de manière textuelle les différents attributs.


Pour l'interface, c'est peut être pas ce qu'il y a de plus propre, à vous de me le dire ^^


@+ (j'arrête pour aujourd'hui sauf si bugs...)

Commentaire de violent_ken le 29/04/2007 19:55:44

Nouvelle MAJ : correction d'un bug critique qui empechait de récupérer les bonnes infos sur les drives.

Commentaire de JLN le 30/04/2007 09:23:55

Super tu as réinventé la roue... Bon je plaisante, très bon code, mais quelle était l'idée de départ pour vouloir réencoder tout ca ? Je sais tout n'existe pas... Mais n'aurait-il pas mieux value ne s'occuper que de l'inexistant ? Sinon c'est du bon et on peut dire même du très bon code.

Bonne prog à tous...

@+ JLN

Commentaire de violent_ken le 30/04/2007 09:41:33

Bah de toutes façons, tout existe déjà un peu !

Nous avions besoin de méthodes et de fonctions sur les fichiers/dossiers/disques pour la VbSystemLibrary... donc j'ai repris du code que j'avais déjà codé, je l'ai réorganisé amélioré et l'ai complété pour arriver à çà.

Cela existe déjà, certes, mais si tu veux parler de FSO, ce code est plus complet et plus rapide que la dll Scripting de microsoft.

"Mais n'aurait-il pas mieux value ne s'occuper que de l'inexistant ?" ==> bah non, je pense qu'il fallait mieux tout reprendre, même les trucs de bases (FileExists, DeleteFile...). Imagine une library qui soit dépendante d'une autre library ! Il était donc bien nécessaire de tout refaire.

Et c'est tellement bien de tout recoder soi-même ^^.... même si certains diront que c'est contraire au principe de base de VB qui consiste à réutiliser en masse ce qui est déjà existant (OCX, Dll activeX...)

@+

Commentaire de drissou le 30/04/2007 11:01:24

VIOLENT_KEN
Super tes classes.
je sui toujours bloqué car je n'ai pas eu le temps de modifer pour que cela focntionne sur Win 98, mais là n'est pas le problème..
je ne sais pas si cela t'intéresse, mais sur PSC il y a un prog pour détecter l'ajout ou la suppression de lecteurs
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=1&txtCodeId=68456
peut être à ajouter pour avoir ce suivi

personnelement je n'ai pas testé non plus mais dans ce vaste projet que tu construis..
Drissou

Commentaire de violent_ken le 30/04/2007 11:12:19

Salut, merci pour l'info ^^

Par contre j'ai regardé le code : un Timer (interval 100) et un DriveListBox, c'est pas ce qu'il y a de plus rapide ;)


Sinon pour W98, il va y avoir du boulot (erf), plusieurs APIs (déjà toutes celles finissant en -Ex) n'existent pas sur cet OS.

@+

Commentaire de JLN le 30/04/2007 11:58:42

Merci pour ta réponse, et en y repensant c'est vrai qu'il vaux mieux avoir qu'une seule librairie à utiliser dans une appli plutot que 2. Et je le redis c'est du bon boulot !

Bonne prog à tous...
@+ JLN

Commentaire de MadM@tt le 01/05/2007 14:19:10

Au passage, cette librairie a enfin été ajouté à la vb system library
http://vbsystemlibrary.free.fr/

Bonne journée à tous !

Commentaire de lokovbf le 18/05/2007 12:58:44

d'abord bravo pr ta classe:
ca va me servir ds mon job parfois le fso de m$ laisse à désirer
voici  qq suggestions à 1ere vue pr optimiser :  
désolé car facile de critiquer, pas eu trop le tps d'examiner ta dll ou de bien rédiger, et me trompe peut-etre ds mon analyse
=> A toi de voir...

- En general pr optimiser:
attention, ton syst est assez lourd (normal, vu l'ampleur de ton boulot.)
mai vb étant ultra-lent:  limite un max les encapsulages/intermerdiaires avant l'operation finale  (ta dll serait nickel en c/c++...)
Quitte à etre moins 'propre', à perdre qq fonctionnalités plus 2aires (car ta dll est suffisament riche)

=> un ex du pb:   on veut lire la prop de n répertoires
for each ... in ....
    Set cFol = FS.GetFolder(Path,true)  
    ... = cFol.DateCreated  <-- c'est ca qui interesse
next

0) set FS= new FileSystem  ' ok

1) FileSystem.GetFolder(Path) :
   Set GetFolder = New Folder  
   GetFolder.SetPath(Path, True) ' 1er intermedaire : ok

2) Folder.Class_Initialize
     Set clsFile = New FileSystem  ' RE-filesystem:  AIE!
3) Folder.SetPath(Path,true)
    MyFolder.Path = Path
    If RefreshInformations (<=true) Then Call RefreshInfos
4) RefreshInfos()
    clsFile.GetFolderDates_HANDLE   .GetShortPath .GetParentFolderName  etc... etc...
' AIE AIE: =>   N accès au disque.  tu extrait TOUTES les props dont je n'avais pas besoin et la, ca peut faire ramer

c'est pire avec la classe File ou on y rajoute des GetAssociatedProgram CompressedFileSize GetFileExtension etc...

je te file qq solutions ds les autres post
si tu fais evoluer ton code, ca m'interesse bcp.
bon courage et bravo

Commentaire de violent_ken le 19/05/2007 10:01:18

Salut, oui, tu as parfaitement raison, c'est très lourd de récupérer une info par le GetFolder.

Donc en l'occurence, si tu veux récupérer le DateCreated de n folders beaucoup plus rapidement, tu feras :
1) s()=clsFile.EnumFoldersStr (ce qui ne récupère qu'un tableau de strings, pas d'objets)
2)
For x=1 to ubound(s())
....= GetFolderDates(s(x)).datecreated

Ainsi, on évite les étapes 2,3 et 4 que tu cites ;) On ne récupères QUE les dates, on n'a qu'à instancier une seule fois en début de prog Set clsFile = New FileSystem.

On n'utilisera GetFolder que pour récupérer toutes les infos sur un dossier, sinon on préferera la méthode que je viens de citer.

@+

Commentaire de hex_man le 12/12/2007 20:45:37

Salut,
Je voulais te dire que ton truc c hyper violent et super complet, que demande le peuple;)

Chapeau!!!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Recherche d'un fichier sur tout le disque [ par Brodeur ] Bonjour, je voudrai faire un progrmme qui recherche un fichier donne sur tout le disque dur automatiquement en incluant les dossier et sous dossier.Me Suppression Fichier/Dossier Corbeil & Fso [ par pcpunch ] Sltje cherche un moyen de supprimer un dossier ou un ficher vers la corbeille?j'ai bien vu qq sources pour les fichiers avec une api mais le probleme acces disque dossier... [ par vroumm ] floje voudrais savoir comment faire pour ouvrir un fichier, avec l'acces disque. c'est à dire drivr, dir et file. En fait comme, avec n'importe quel l obtenir le nom d'un dossier erreur Class not registered [ par Fwdavy ] J'essaye d'obtenir le nom d'un dossier et j'utilise la methode ci-dessous sur PC, mais sur pocket PC j'ai cette erreur : COM object with CLISD '{xxxxx vbscript [ par marie059 ] Bonjour je dois crée un script en vbscript qui dans un dossier et sous dossier choisi authorisera uniquement la lecture pour les fichiers dont la dat Script, Dossier + Sous Dossier + "publication" page HTML [ par Alexis28130 ] Bonjours voila mon souci... Je liste TOUS les fichier de C et je l'est met dans un fichier HTML, je voudrais faire la même chose sauf que dans le html macro sur un dossier de fichier excel [ par funkay91 ] je souhaite appliquer ma macro sur l'ensemble des fichiers .xls de mon dossier&nbsp;C'est dire j'ai un fichier exel dans lequel j'aurai ma macro&nbsp; Ecriture de fichier sur disque [ par sokajoho ] Salut, J'ai un fichier hex que j'arrive bien &#224; convertir en d&#233;cimal ainsi qu'en caract&#232;res: outall est mon fichier hex &nbsp;For i = 1 Copier fichier temporaire [ par croftman ] Bonjour,Voila, j'aimerais copier des fichiers situer dans le dossier "temporary internet files"(sous xp) dans un autre dossier, mais quand j'essaie av enregistre un fichier zip depuis le web [ par bucheron1 ] Salut, je voudrais savoir &nbsp;comment faire pour enregistrer sur mon disque dur un fichier "zip" depuis un lien dans une textbox.je clique mad max 3


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,273 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales