lionyz
Messages postés62Date d'inscriptionsamedi 10 janvier 2009StatutMembreDernière intervention30 octobre 2012 3 févr. 2012 à 22:31
Bonjour,
Il est vrai que la fonction Scan (exemple ci-dessus) pose problème
pour des fichiers en réseau (\\remotehost\share\fichier.txt)
Exemple: pour scanner un dossier en réseau de 200 fichiers il faut plus de 10 mn alors que pour
le même dossier en local il ne faut que quelques secondes
Même si le temps d'accès à un fichier en réseau est plus long que pour un fichier
en local, je ne comprends pas pourquoi dans ce cas le scan est aussi lent.
Baddante
Messages postés33Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention24 février 2008 3 févr. 2012 à 09:32
L'API ok, perf. avantage.
Simplicité d'écriture le code VB, mais limité à taille en octets sur 32 bits (limite VB6)
donc fichier(s) ou addition de fichiers dans un dossier inférieures à 2 go (environ)
Le FSO (filesystemObject) est simple à utiliser / coder par rapport à l'api et fonctionne avec
une property size sur 64 bits.
A noter qu'on ne peut ouvrir / gérer un fichier avec une syntaxe UNC (\\remotehost\share)
\fichier.txt) en DOT.NET l'utilisation UNC, par exemple pour créé un dossier fonctionne.
lionyz
Messages postés62Date d'inscriptionsamedi 10 janvier 2009StatutMembreDernière intervention30 octobre 2012 5 déc. 2011 à 12:41
Un exemple qui utilise la fonction Scan
Permet de mettre tous les sous-dossiers d'un dossier dans une liste (ListDoss)
et tous les fichiers des sous-dossiers dans une autre liste (ListFich)
Il faut initialiser les 2 listes (ListView) et référencer microsoft scripting runtime
Dim Dossier As Folder, Sousdossier As Folder, Fichier As File
Dim fso As FileSystemObject
Private Sub Form_Load()
Scan_Dossier "c:\MonDossier"
End Sub
Sub Scan_Dossier(ByVal Dossier As Folder)
On Error GoTo Erreur
Dim PlusDossier as Boolean
For Each Fichier In Dossier.Files
If PlusDossier = False Then Set itmx ListDoss.ListItems.Add(, , Dossier): PlusDossier True
End If
Set itmy = ListFich.ListItems.Add(, , Fichier)
Next
PlusDossier = False
For Each Sousdossier In Dossier.SubFolders
Scan_Dossier Sousdossier
Next
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 2 déc. 2011 à 08:51
Non, JJDai, ce n'est pas une option !
fileSCRIPTINGobject le bien nommé est a reserver au scripting
trop lent en dehors...
ca fonctionne, mais c'est lent et ajoutes une dépendance
jjDai
Messages postés291Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention13 mars 2015 1 déc. 2011 à 18:53
Un petit exemple:
Option Explicit
Sub test()
listerDossiers ("c:")
End Sub
Sub listerDossiers(Optional sFolder As String = "")
Dim fso As FileSystemObject
Dim fld As Folder
Dim fldParent As Folder
Set fso = New FileSystemObject
Set fldParent = fso.GetFolder(sFolder)
For Each fld In fldParent.SubFolders
Debug.Print fld.Path & "-" & fld.Size
Call listerDossiers(fld.Path)
DoEvents
Next
End Sub
Il faut bien sur référencer microsoft scripting runtime
JJDai
jjDai
Messages postés291Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention13 mars 2015 1 déc. 2011 à 18:37
Bonjour
Ou l'utilisation de l'objet fileSystemObject de la bibliothèque vbrunscript.
JJDai
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 1 déc. 2011 à 07:36
l'API FindFirstFile et ses copines fonction aussi bien l'affaire...
et ca t'eviterais cette gymnastique avec le Dir
Je ne suis pas fan de ta seconde boucle :
'après avoir examiné le sous-dossier, il faut repositionner Dir sur l'entrée suivante
'car la fonction dir n'est pas récursive et a donc perdue la dernière position
'on réinitialise donc Dir et repositionne le flag à la bonne place avec NbreFichiersLus
FichierLu = Dir(Chemin, vbDirectory)
For i = 1 To NbreFichiersLus - 1
FichierLu = Dir
Next i
C'est une perte de temps...
Ta procédure, outre ces Debug.Print qui la rendent assez verbeuse... n'est pas facilement réutilisable dans un autre projet.
En effet, elle travaille avec un tableau prédéfinit...
Ton tableau possède une case vide en fin de tableau, pour quelle raison ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 1 déc. 2011 à 02:13
Salut
La fonction Dir est lourde en temps d'exécution.
La méthode qui consiste à resynchroniser la fonction après avoir exploité d'autres répertoires va ralentir considérablement le programme dès qu'on s'attaque à des répertoires nombreux et chargés.
Sans vouloir me faire de pub, j'ai bossé sur le sujet il y a quelques années : http://www.vbfrance.com/codes/REMPLACER-DIR-CLASSE-DIR2-AVANTAGES_37859.aspx
3 févr. 2012 à 22:31
Il est vrai que la fonction Scan (exemple ci-dessus) pose problème
pour des fichiers en réseau (\\remotehost\share\fichier.txt)
Exemple: pour scanner un dossier en réseau de 200 fichiers il faut plus de 10 mn alors que pour
le même dossier en local il ne faut que quelques secondes
Même si le temps d'accès à un fichier en réseau est plus long que pour un fichier
en local, je ne comprends pas pourquoi dans ce cas le scan est aussi lent.
3 févr. 2012 à 09:32
Simplicité d'écriture le code VB, mais limité à taille en octets sur 32 bits (limite VB6)
donc fichier(s) ou addition de fichiers dans un dossier inférieures à 2 go (environ)
Le FSO (filesystemObject) est simple à utiliser / coder par rapport à l'api et fonctionne avec
une property size sur 64 bits.
A noter qu'on ne peut ouvrir / gérer un fichier avec une syntaxe UNC (\\remotehost\share)
\fichier.txt) en DOT.NET l'utilisation UNC, par exemple pour créé un dossier fonctionne.
5 déc. 2011 à 12:41
Permet de mettre tous les sous-dossiers d'un dossier dans une liste (ListDoss)
et tous les fichiers des sous-dossiers dans une autre liste (ListFich)
Il faut initialiser les 2 listes (ListView) et référencer microsoft scripting runtime
Dim Dossier As Folder, Sousdossier As Folder, Fichier As File
Dim fso As FileSystemObject
Private Sub Form_Load()
Scan_Dossier "c:\MonDossier"
End Sub
Sub Scan_Dossier(ByVal Dossier As Folder)
On Error GoTo Erreur
Dim PlusDossier as Boolean
For Each Fichier In Dossier.Files
If PlusDossier = False Then Set itmx ListDoss.ListItems.Add(, , Dossier): PlusDossier True
End If
Set itmy = ListFich.ListItems.Add(, , Fichier)
Next
PlusDossier = False
For Each Sousdossier In Dossier.SubFolders
Scan_Dossier Sousdossier
Next
Set itmx = Nothing
Set itmy = Nothing
Exit Sub
Erreur:
MsgBox Err.Number & vbCrLf & Err.Description
Err.Clear
End Sub
2 déc. 2011 à 08:51
fileSCRIPTINGobject le bien nommé est a reserver au scripting
trop lent en dehors...
ca fonctionne, mais c'est lent et ajoutes une dépendance
1 déc. 2011 à 18:53
Option Explicit
Sub test()
listerDossiers ("c:")
End Sub
Sub listerDossiers(Optional sFolder As String = "")
Dim fso As FileSystemObject
Dim fld As Folder
Dim fldParent As Folder
Set fso = New FileSystemObject
Set fldParent = fso.GetFolder(sFolder)
For Each fld In fldParent.SubFolders
Debug.Print fld.Path & "-" & fld.Size
Call listerDossiers(fld.Path)
DoEvents
Next
End Sub
Il faut bien sur référencer microsoft scripting runtime
JJDai
1 déc. 2011 à 18:37
Ou l'utilisation de l'objet fileSystemObject de la bibliothèque vbrunscript.
JJDai
1 déc. 2011 à 07:36
et ca t'eviterais cette gymnastique avec le Dir
Je ne suis pas fan de ta seconde boucle :
'après avoir examiné le sous-dossier, il faut repositionner Dir sur l'entrée suivante
'car la fonction dir n'est pas récursive et a donc perdue la dernière position
'on réinitialise donc Dir et repositionne le flag à la bonne place avec NbreFichiersLus
FichierLu = Dir(Chemin, vbDirectory)
For i = 1 To NbreFichiersLus - 1
FichierLu = Dir
Next i
C'est une perte de temps...
Ta procédure, outre ces Debug.Print qui la rendent assez verbeuse... n'est pas facilement réutilisable dans un autre projet.
En effet, elle travaille avec un tableau prédéfinit...
Ton tableau possède une case vide en fin de tableau, pour quelle raison ?
1 déc. 2011 à 02:13
La fonction Dir est lourde en temps d'exécution.
La méthode qui consiste à resynchroniser la fonction après avoir exploité d'autres répertoires va ralentir considérablement le programme dès qu'on s'attaque à des répertoires nombreux et chargés.
Sans vouloir me faire de pub, j'ai bossé sur le sujet il y a quelques années : http://www.vbfrance.com/codes/REMPLACER-DIR-CLASSE-DIR2-AVANTAGES_37859.aspx