OVH Cloud OVH Cloud

Nombre de fichiers

17 réponses
Avatar
mg
SAlut,
je souhaite récupérer le nombre de fichier dans un dossier sans passer par
un traitement Dir.
Merci.

10 réponses

1 2
Avatar
Jacques93
Bonjour mg,
mg a écrit :
SAlut,
je souhaite récupérer le nombre de fichier dans un dossier sans passer par
un traitement Dir.



Tu peux essayer avec FileSystemObject (tant que Zoury n'est pas là :-) )

Dim fso As Object ' FileSystemObject
Dim fld As Object ' Folder

Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("C:Download")
MsgBox fld.Files.Count & " fichier(s) dans : " & _
fld.Drive & "" & fld.Name
Set fld = Nothing
set fso = Nothing

--
Cordialement,

Jacques.
Avatar
mg
Désolé,
mais surtout pas cette horreur.
je cherche plus une API.

"Jacques93" a écrit dans le message de news:
#
Bonjour mg,
mg a écrit :
> SAlut,
> je souhaite récupérer le nombre de fichier dans un dossier sans passer


par
> un traitement Dir.

Tu peux essayer avec FileSystemObject (tant que Zoury n'est pas là :-) )

Dim fso As Object ' FileSystemObject
Dim fld As Object ' Folder

Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder("C:Download")
MsgBox fld.Files.Count & " fichier(s) dans : " & _
fld.Drive & "" & fld.Name
Set fld = Nothing
set fso = Nothing

--
Cordialement,

Jacques.


Avatar
Jacques93
Bonjour mg,
mg a écrit :
Désolé,
mais surtout pas cette horreur.
je cherche plus une API.




Avec une API, je ne connais pas. Celles que je connais reviennent à
faire le même type de boucle qu'avec Dir, et je ne suis pas sûr que le
gain de temps soit significatif, mais à tout hasard, voire les API :

FindFirstFile, FindNextFile et FindClose

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/win32_find_data_str.asp

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"Jacques93" a écrit dans le message de
news:
Bonjour mg,
mg a écrit :
> Désolé,
> mais surtout pas cette horreur.
> je cherche plus une API.
>

Avec une API, je ne connais pas. Celles que je connais reviennent à
faire le même type de boucle qu'avec Dir, et je ne suis pas sûr que le
gain de temps soit significatif, mais à tout hasard, voire les API :

FindFirstFile, FindNextFile et FindClose




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/win32_find_data_str.asp


Bonjour à tous,

Je me suis amusé à tester les performances.
Résultat des courses:
- égalité parfaite entre les API et Dir$()
- le FileSystemObject (bheuuu...) est 2 fois plus rapide
environ, sur un répertoire comportant 2200 fichiers.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Jean-Marc,
Jean-Marc a écrit :
"Jacques93" a écrit dans le message de
news:

Bonjour mg,
mg a écrit :

Désolé,
mais surtout pas cette horreur.
je cherche plus une API.




Avec une API, je ne connais pas. Celles que je connais reviennent à
faire le même type de boucle qu'avec Dir, et je ne suis pas sûr que le
gain de temps soit significatif, mais à tout hasard, voire les API :

FindFirstFile, FindNextFile et FindClose





http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/win32_find_data_str.asp


Bonjour à tous,

Je me suis amusé à tester les performances.
Résultat des courses:
- égalité parfaite entre les API et Dir$()
- le FileSystemObject (bheuuu...) est 2 fois plus rapide
environ, sur un répertoire comportant 2200 fichiers.




Merci Jean-Marc pour ces tests. Y aurait il une API, ou une info dans
une structure, que nous n'aurions pas vue (ou non documentée) qui
expliquerait cette différence ???

Question annexe. Tu as effectués les tests sur une partition FAT32 ou NTFS ?

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"Jacques93" a écrit dans le message de
news:
Bonjour Jean-Marc,
Jean-Marc a écrit :
> "Jacques93" a écrit dans le message de
> news:
>
>>Bonjour mg,
>>mg a écrit :
>>
>>>Désolé,
>>>mais surtout pas cette horreur.
>>>je cherche plus une API.
>>>
>>
>>Avec une API, je ne connais pas. Celles que je connais reviennent à
>>faire le même type de boucle qu'avec Dir, et je ne suis pas sûr que le
>>gain de temps soit significatif, mais à tout hasard, voire les API :
>>
>> FindFirstFile, FindNextFile et FindClose
>>
>>
>
>


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/win32_find_data_str.asp
>
>
> Bonjour à tous,
>
> Je me suis amusé à tester les performances.
> Résultat des courses:
> - égalité parfaite entre les API et Dir$()
> - le FileSystemObject (bheuuu...) est 2 fois plus rapide
> environ, sur un répertoire comportant 2200 fichiers.




Re coucou,

Merci Jean-Marc pour ces tests. Y aurait il une API, ou une info dans
une structure, que nous n'aurions pas vue (ou non documentée) qui
expliquerait cette différence ???



Si elle(s) existe(nt), je ne la(les) connait pas ..

Question annexe. Tu as effectués les tests sur une partition FAT32 ou NTFS


?

Sur une partition NTFS.

J'ai fait 2 séries de mesures, sous IDE puis en lançant l'exe; les résultats
sont identiques: égalité des 2 méthodes, et peu de différences IDE/compilé.
La proportion 2/1 en faveur de FSO se maintient en IDE/compilé.

Je n'ai pas non plus d'explication pour cette différence FSO/API, encoe que
...
je me demande si en utilisant les API dans un programme C et en faisant
une petite fonction appelable depuis une dll on ne retrouverait pas des
perfs
proches de fso ? A creuser ?

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
Héhé !!

Mon intuition était juste. J'ai fait une dll en C qui
utilse les API FindFirstFile et FindNextFile, exactement
comme je le faisais avec mon programme VB.
J'appelle cette dll depuis mon programme de test VB.
Résultat:

2,2 fois plus rapide qu'en appelant les API depuis VB, soit
encore un peu plus rapide que FSO.

Et voila le travail :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Jean-Marc,
Jean-Marc a écrit :
Héhé !!

Mon intuition était juste. J'ai fait une dll en C qui
utilse les API FindFirstFile et FindNextFile, exactement
comme je le faisais avec mon programme VB.
J'appelle cette dll depuis mon programme de test VB.
Résultat:

2,2 fois plus rapide qu'en appelant les API depuis VB, soit
encore un peu plus rapide que FSO.

Et voila le travail :-)




Tu creuses plus vite que moi ;-) . Je viens juste de finir le prog VB
avec les versions Dir, API et FSO, avant d'attaquer la Dll. J'avais un
souci c'est que les temps étaient similaires entre les 3 (entre 0 et 10
millisecondes sur un répertoire de 2600 fichiers... difficile de se
faire une idée, j'envisageai donc de remettre en service un matériel un
peu moins nerveux...

On peut donc en conclure que ce sont les appels successifs à l'api
FindNextFile et le passage de paramètres à partir de VB, qui consomme du
temps (FindFirstFile n'étant appelée qu'une fois). Et que donc dans
certain cas, et je pèse mes mots, restons prudent, pas de provocation
... FSO c'est peut être pas si mal que ça ? tout le monde n'ayant pas
soit la compétence, soit l'outil pour développer une Dll en C.

En tout cas Bravo !!! ;-)

--
Cordialement,

Jacques.
Avatar
Picalausa François
Hello,

Pour passer le temps, voici deux questions (qui pourraient servir à
améliorer les perfs?):
Les tests ont-ils été fait avec la version ansi ou unicode des API, sous VB?
On peut référencer les API directement depuis un module dans une typelib.
Cela apporte-t-il encore de la performance?

Pour la version unicode des API, il faut (utiliser la traduction du verbe to
prepend ici) "?" au chemin (ce qui peut prendre un temps certain). A
noter que sous 9x/Me, la version unicode de ces API sont supportées par
MSLU.

Voici le code correspondant aux deux points:
Const MAX_PATH = 260

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName(MAX_PATH * 2 - 1) As Byte
cAlternateFileName As String * 28
End Type

Private Declare Function FindNextFile _
Lib "kernel32" _
Alias "FindNextFileW" _
( _
ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA _
) _
As Long
Private Declare Function FindFirstFile _
Lib "kernel32" _
Alias "FindFirstFileW" _
( _
ByVal lpFileName As Long, _
lpFindFileData As WIN32_FIND_DATA _
) _
As Long
Private Declare Function FindClose _
Lib "kernel32" _
( _
ByVal hFindFile As Long _
) _
As Long

Private Const INVALID_HANDLE_VALUE = -1

Private Const FILE_ATTRIBUTE_READONLY = &H1
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const FILE_ATTRIBUTE_SYSTEM = &H4
Private Const FILE_ATTRIBUTE_DIRECTORY = &H10
Private Const FILE_ATTRIBUTE_ARCHIVE = &H20
Private Const FILE_ATTRIBUTE_DEVICE = &H40
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_ATTRIBUTE_TEMPORARY = &H100
Private Const FILE_ATTRIBUTE_SPARSE_FILE = &H200
Private Const FILE_ATTRIBUTE_REPARSE_POINT = &H400
Private Const FILE_ATTRIBUTE_COMPRESSED = &H800
Private Const FILE_ATTRIBUTE_OFFLINE = &H1000
Private Const FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = &H2000
Private Const FILE_ATTRIBUTE_ENCRYPTED = &H4000

Public Function FileCount(Folder As String) As Long
Dim strAPIFolderPath As String
Dim hFind As Long
Dim W32FD As WIN32_FIND_DATA

'! valable si local uniquement
If Right$(Folder, 1) = "" Then
strAPIFolderPath = "?" & Folder & "*"
Else
strAPIFolderPath = "?" & Folder & "*"
End If

hFind = FindFirstFile(StrPtr(strAPIFolderPath), W32FD)

'S'assure que la recherche a fonctionné
If Not hFind = INVALID_HANDLE_VALUE Then
'Boucle tant qu'il y a des fichiers
Do
'Ne compte pas les sous dossiers
If (W32FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0
Then
FileCount = FileCount + 1
End If
Loop While FindNextFile(hFind, W32FD)

FindClose hFind
End If
End Function

La typelib correspondante est la suivante:
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: w32Find.tlb
[
uuid(22313A55-58BD-4306-9578-802F5F0DE9FD),
version(1.0)
]
library Win32 Find APIs for VB
{
// TLib : // Forward declare all types defined in this typelib
[
dllname("kernel32.Dll")
]
module Win32Find {
[entry(0x60000000)]
long _stdcall FindNextFile([in] long hfind, [out] WIN32_FIND_DATA*
lpFindFileData);

[entry(0x60000001)]
long _stdcall FindFirstFile([in] LPWSTR lpFileName, [out]
WIN32_FIND_DATA* lpFindFileData);

[entry(0x60000002)]
long _stdcall FindClose([in] long hfind);

const long INVALID_HANDLE_VALUE = 0xffffffff;
const long FILE_ATTRIBUTE_READONLY = 1;
const long FILE_ATTRIBUTE_HIDDEN = 2;
const long FILE_ATTRIBUTE_SYSTEM = 4;
const long FILE_ATTRIBUTE_DIRECTORY = 16;
const long FILE_ATTRIBUTE_ARCHIVE = 32;
const long FILE_ATTRIBUTE_DEVICE = 64;
const long FILE_ATTRIBUTE_NORMAL = 128;
};

typedef struct tagFILETIME {
long dwLowDateTime;
long dwHighDateTime;
} FILETIME;
typedef struct tagWIN32_FIND_DATA {
long dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
long nFileSizeHigh;
long nFileSizeLow;
long dwReserved0;
long dwReserved1;
unsigned char cFileName[520];
unsigned char cAlternateFileName[28];
} WIN32_FIND_DATA;
};
(version compilée de cette tlb en pièce jointe)

Le code est le même qu'au point à, mis à part qu'il faut omettre les
déclarations d'APIs

--
Picalausa François

"Jean-Marc" a écrit dans le message de news:
437f2952$0$13444$
Mon intuition était juste. J'ai fait une dll en C qui
...
2,2 fois plus rapide qu'en appelant les API depuis VB, soit
encore un peu plus rapide que FSO.





begin 666 w32Find.tlb
M35-&5 (``0``````"00```````!1`0```0`````````#````_____P``````
M````'@```,0!````````__________@````@ ```/____`````_____P``
M``!D````R ```%0!```L`0``_____P```#_____`````/____/````____
M_P````#_____#P```/____`````_____P```" `@``@ ```/____/````
M``,``!@```#_____#P```!@#`````@``_____P````8!0``8 ,``/____/
M````> @``#P```#_____#P```+0(```H````_____P```#<" ``( ```/__
M__/````_ @```@```#_____#P```/____`````_____P```#_____````
M`/____/````_____P````#_____#P```"()```$"0``0 ,``%@"```#````
M``````,`" ``````````````````````_____P`````D`````````/____`
M`````````/____``````@```````````````````/____]A" $`U H``&@`
M``!8`````P````````````(``````````````````````/____`````/ ``
M``````#_____``````````#_____``````@```#_____``````````#_____
M(2$"`!@+``! `P``N $```,````````````*``````````````````````#_
M____`````% `````````_____P``````````_____P````!0`@``_____P``
M````````____________________________________________________
M____________________________________________________________
M__________________________________________`````____________
M____53HQ(KU8!D.5>( O7PWI_?[_________________________________
M________________________; ```/______________________________
M_________________Z@"``#_______________H`P``^ ```.P!``#_____
M' (``/____________________________________$`@``_____SP````<
M`0``________________________________________________________
M___0`0``______@"```0`P``__________`````________________L ``
M`' "``#$`@``_____]0```#_____. (``/__________________________
M____________________________________________________________
M____C ```/_______________________________[0!``#_____________
M________4 ```/_____@`@``) ```/____________________^(`0``____
M____________H $``/__________5 (``/__________________________
M________________0 ,``/______________________________________
M_________Q8`.$I7:6XS,B!&:6YD($%027,@9F]R(%9"5U<`````_____PDX
MXZ97:6XS,D9I;F175U=D````)9!&24Q%5$E-1<@```#_____#SC@
MME=)3C,R7T9)3D1?1$%405<`````_____Q0PB8Q)3E9!3$E$7TA!3D1,15]6
M04Q510````#_____%S!4A49)3$5?05144DE"551%7U)%041/3DQ95P````#_
M____%3 B49)3$5?05144DE"551%7TA)1$1%3EuP````#_____%3! 1$9)
M3$5?05144DE"551%7U-94U1%35uP````#_____&# 8YD9)3$5?05144DE"
M551%7T1)4D5#5$]260````#_____%C F)49)3$5?05144DE"551%7T%20TA)
M5D575P````#_____%3!OYT9)3$5?05144DE"551%7T1%5DE#15uP````#_
M____%3"^>T9)3$5?05144DE"551%7TY/4DU!3%uP````#_____##!H1$9I
M;F1.97AT1FEL9?__________!0!L'&AF:6YD5U=7__________.`%N,;'!&
M:6YD1FEL941A=&%75P````#_____#3"RV49I;F1&:7)S=$9I;&575U?_____
M_____PH`F3)L<$9I;&5.86UE5U<`````_____PDPHA&:6YD0VQO<V575U=D
M````_____PT0&[9D=TQO=T1A=&54:6UE5Uy ```/____.$$+&9'=(:6=H
M1&%T951I;6575@```! `0``$!!OEF1W1FEL94%T=')I8G5T97/(````____
M_PX0O7MF=$-R96%T:6]N5&EM95=7R ```/____$+7%9G1,87-T06-C97-S
M5&EM9<@```#_____#Q 3,&9T3&%S=%=R:71E5&EM95?(````9 $```T0/DYN
M1FEL95-I>F5(:6=H5U=7R ```/____,$&(U;D9I;&53:7IE3&]WR ```/__
M__+$+1 9')7-E<G9E9#!7R ```(P"```+$+5 9')7-E<G9E9#%7R ``
M`/____)$!<*8T9I;&5.86UE5U=7R ```/____2$/@:8T%L=&5R;F%T949I
M;&5.86UE5U<,`&ME<FYE;#,R+D1L;%=7#0!&:6YD3F5X=$9I;&575PX`1FEN
M9$9I<G-T1FEL95<)`$9I;F1#;&]S95<=`/]_R ```!H`_W`````'0#_?V0`
M```<`/Y_`````!P`_G````$0`1@ $`" `(`@```0```!$`$8 !``@`' ``
M``$````#`/____]75T@!````````P`#@ ```````%P`"P0```(`````````
M_____Q ````#``. H $```$````(````M $```(``````$``P`#@ ``````
M`%P`"P0!``(`````````_____R ````?`/[_[ $```$````(````M $```(`
M```P``(``P`#@ ```````$0`"P0"``$`````````_____S ````#``. H $`
M``$````4``,``P`#@ `````"`#0``````!0`! `#``. ``````(`- `!``",
M% `%``,``X ``````@`T``(``(P4``8``P`#@ `````"`#0`! ``C!0`!P`#
M``. ``````(`- `0``",% `(``,``X ``````@`T`" ``(P4``D``P`#@ ``
M```"`#0`0 ``C!0`"@`#``. ``````(`- " ``",````8 $``& "``!@`P``
M0 0``$ %``! !@``0 <``$ (``! "0``0 H``$"(`0``T $```0"``!L````
MC ```+ ```#4````^ ```!P!``! `0``9 $````````````> ```*@```"
M````T ```.0```#X````# $``" !```T`0``* ```!0````#``. ````````
M) ``````% `!``,``X ````````D``0```````! `0``0!P"```X`@``````
M`!0```#(````% ````,``X ````````D```````4``$`$ ```````````"0`
M! ```!0``@`0````````````) `,````% `#`! ````````````D`!0````4
M``0``P`#@ ```````"0`' ```!0`!0`#``. ````````) `@````% `&``,`
M`X ````````D`"0````4``<``P`#@ ```````"0`* ```!0`" `8````````
M````. `L````% `)`" ````````````X`#0"``````! `P``0 (``$ $``!
M!0``0 8``$ '``! " ``0 D``$ *``! 5 (``' "``",`@``J (``,0"``#@
M`@``^ (``! #```H`P``0 ,````````4````* ```#P```!0````9 ```'@`
.``",````H ```+0`````
`
end
Avatar
Jean-Marc
"Jacques93" a écrit dans le message de
news:
Bonjour Jean-Marc,
Jean-Marc a écrit :
> Héhé !!
>
> Mon intuition était juste. J'ai fait une dll en C qui
> utilse les API FindFirstFile et FindNextFile, exactement
> comme je le faisais avec mon programme VB.
> J'appelle cette dll depuis mon programme de test VB.
> Résultat:
>
> 2,2 fois plus rapide qu'en appelant les API depuis VB, soit
> encore un peu plus rapide que FSO.
>
> Et voila le travail :-)



Re,

Tu creuses plus vite que moi ;-) . Je viens juste de finir le prog VB
avec les versions Dir, API et FSO, avant d'attaquer la Dll. J'avais un
souci c'est que les temps étaient similaires entre les 3 (entre 0 et 10
millisecondes sur un répertoire de 2600 fichiers... difficile de se
faire une idée, j'envisageai donc de remettre en service un matériel un
peu moins nerveux...



En effet, j'ai pu mesuré des différences uniquement en faisant des mesures
répétées: un boucle de 1000 appels, dans le répertoire windowssystem32.
Le temps mesué était de 10 secondes pour API (VB)/DIR et 4,5 secondes pour
Fso.

On peut donc en conclure que ce sont les appels successifs à l'api
FindNextFile et le passage de paramètres à partir de VB, qui consomme du
temps (FindFirstFile n'étant appelée qu'une fois).



J'arrive tout à fait à la même conclusion. Des mesures précédentes avaient
déjà montré que à algorithme et implémentation égale (ou silmilaire), le
codage en C et appel via une dll était en moyenne 2,5 à 3 fois plus rapide
que les appels en VB.
J'avais fait une page sur le sujet à l'époque:
http://myjmnhome.dyndns.org/bench/bench3.htm


Et que donc dans
certain cas, et je pèse mes mots, restons prudent, pas de provocation
... FSO c'est peut être pas si mal que ça ? tout le monde n'ayant pas
soit la compétence, soit l'outil pour développer une Dll en C.



Pour la compétence (pour l'outil je ne peux pas faire grand chose), j'avais
aussi fait un mini tutorial:
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm


Je tiens la dll compilée et son code à la disposition de ceux qui le veulent
et au besoin je mettrais le tout sur une page web.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
1 2