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.

7 réponses

1 2
Avatar
Jean-Marc
Désolé pour toutes les fautes de grammaire de
mon post précédent :-(

"j'ai pu mesurer", pas "mesuré" <<== honte!!
^^^^^^^
etc.

--
Jean-marc
Avatar
Jacques93
Bonjour Jean-Marc,
Jean-Marc a écrit :
Désolé pour toutes les fautes de grammaire de
mon post précédent :-(

"j'ai pu mesurer", pas "mesuré" <<== honte!!
^^^^^^^
etc.




Bah, Le samedi, c'est relâche ... ;-)

A part quelque petites différences j'ai procédé de manière similaire à
ton tutorial. J'ai utilisé au début Sample Dll Project au lieu de Empty
Dll project, et j'utilise un .cpp (code minimal...) :

// FileCount.cpp
//----------------------------------------------------------------
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "Winbase.h"
#include "Windows.h"
#include "FileCount.h"

WINAPI VB_FileCount (LPCSTR fName) {
WIN32_FIND_DATA wfd;
HANDLE hFind;
long i;

i = 0;
hFind = FindFirstFile (fName,&wfd);
if (hFind != 0) {
while (FindNextFile (hFind, &wfd) != 0) i++;
}
FindClose (hFind);
return i;
}
//------------------------------------------------------------------

un .H :

// FileCount.h
extern WINAPI VB_FileCount (LPCSTR);


et un .DEF :

EXPORTS
VB_FileCount @1


Mais au final les résultats sont similaires, sauf peut être en taille de
la dll (40 Ko pour moi, en version Release)

Ne frise je pas le HS dans un forum VB, je risque d' attirer des êtres
étranges :-D

--
Cordialement,

Jacques.
Avatar
Aski
Salutatoi Jean-Marc,

Tu as donc déclaré :

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.



Je suis preneur du tout. :-)

Merci Jean-Marc
Avatar
Jacques93
Bonjour Picalausa François,
Picalausa François a écrit :
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




Pas le temps avant l'apéro ;-) . Mais je mets de côté. Merci.

--
Cordialement,

Jacques.
Avatar
Jean-Marc
"Aski" a écrit dans le message de
news:
Salutatoi Jean-Marc,

Tu as donc déclaré :

> 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.

Je suis preneur du tout. :-)




Hello,

J'ai donc mis en ligne la dll en C (le code est presque identique
à celui de Jacques) ainsi que le programme d'exemple en VB illustrant
l'appel de cet dll.
Tout est ici:

http://myjmnhome.dyndns.org/download.htm

Premier lien de "Autres Téléchargements"

--
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
"Jacques93" a écrit dans le message de
news:%
Bonjour Jean-Marc,
Jean-Marc a écrit :
> Désolé pour toutes les fautes de grammaire de
> mon post précédent :-(
>
> "j'ai pu mesurer", pas "mesuré" <<== honte!!
> ^^^^^^^
> etc.
>

Bah, Le samedi, c'est relâche ... ;-)

A part quelque petites différences j'ai procédé de manière similaire à
ton tutorial. J'ai utilisé au début Sample Dll Project au lieu de Empty
Dll project, et j'utilise un .cpp (code minimal...) :

// FileCount.cpp
//----------------------------------------------------------------
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "Winbase.h"
#include "Windows.h"
#include "FileCount.h"

WINAPI VB_FileCount (LPCSTR fName) {
WIN32_FIND_DATA wfd;
HANDLE hFind;
long i;

i = 0;
hFind = FindFirstFile (fName,&wfd);
if (hFind != 0) {
while (FindNextFile (hFind, &wfd) != 0) i++;
}
FindClose (hFind);
return i;
}
//------------------------------------------------------------------

un .H :

// FileCount.h
extern WINAPI VB_FileCount (LPCSTR);


et un .DEF :

EXPORTS
VB_FileCount @1


Mais au final les résultats sont similaires, sauf peut être en taille de
la dll (40 Ko pour moi, en version Release)



J'obtient la même taille :-)

Ne frise je pas le HS dans un forum VB, je risque d' attirer des êtres
étranges :-D



Non on est encore en charte, du moins je le pense sincèrement car on
parle de VB, ce performances en VB, de façon de résoudre un problème en VB
et le fait que la résolution passe par des appels de fonction de l'API
Windows n'est pas hors charte en soi :-)

--
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
Aski
Salutatoi Jean-Marc,

Tu as donc déclaré :

"Aski" a écrit dans le message de
news:
Salutatoi Jean-Marc,

Tu as donc déclaré :

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.



Je suis preneur du tout. :-)




Hello,

J'ai donc mis en ligne la dll en C (le code est presque identique
à celui de Jacques) ainsi que le programme d'exemple en VB illustrant
l'appel de cet dll.
Tout est ici:

http://myjmnhome.dyndns.org/download.htm

Premier lien de "Autres Téléchargements"



Merci

Cordialement

Aski
1 2