FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Comment connaître les dates de création, de dernière modification et de dernier accès à un fichier ?
- Comment savoir si un fichier donné se trouve bien dans un répertoire ?
- Comment savoir si un fichier existe ?
- Comment connaître la taille d'un dossier ou répertoire ?
- Comment récupérer la taille d'un fichier ?
- Comment obtenir la taille d'un répertoire ?
- Comment récupérer les propriétés d'un PDF ?
- Comment savoir si un fichier est ouvert ?
- Comment compter les fichiers dans un répertoire ?
En passant soit par les API, soit par le FileSystemObject. En natif, VB ne donne accès qu'à la date de dernière modification, via la fonction FileDateTime(). Si vous choisissez de passer par les API, voici les déclarations nécessaires :
Private
Const
MAX_PATH =
260
Private
Type
FILETIME
dwLowDateTime As
Long
dwHighDateTime As
Long
End
Type
Private
Type
SYSTEMTIME
wYear As
Integer
wMonth As
Integer
wDayOfWeek As
Integer
wDay As
Integer
wHour As
Integer
wMinute As
Integer
wSecond As
Integer
wMilliseconds As
Integer
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 As
String
*
MAX_PATH
cAlternate As
String
*
14
End
Type
Private
Const
INVALID_HANDLE_VALUE =
-
1
Private
Declare
Function
FindFirstFile Lib
"kernel32"
Alias "FindFirstFileA"
_
(
ByVal
lpFileName As
String
, _
lpFindFileData As
WIN32_FIND_DATA) As
Long
Private
Declare
Function
FindClose Lib
"kernel32"
(
ByVal
hFindFile As
Long
) As
Long
Private
Declare
Function
FileTimeToSystemTime Lib
"kernel32"
_
(
lpFileTime As
FILETIME, _
lpSystemTime As
SYSTEMTIME) As
Long
Private
Declare
Function
FileTimeToLocalFileTime Lib
"kernel32"
_
(
lpFileTime As
FILETIME, _
lpLocalFileTime As
FILETIME) As
Long
Les dates d'un fichier sont récupérées par la fonction FindFirstFile qui attend en paramètres le nom du fichier et une structure WIN32_FIND_DATA qui reçoit les informations obtenues. Les dates de création, de dernière modification et de dernier accès sont stockées respectivement dans les champs ftCreationTime, ftLastWriteTime et ftLastAccessTime, tous de type FILETIME. Pour avoir des dates sous une forme exploitable, quelques conversions sont nécessaires. Notre fonction FileTimeToDate() convertit une date de type FILETIME en type Date.
Private
Function
FileTimeToDate
(
ft As
FILETIME) As
Date
Dim
datelocale As
FILETIME, datesys As
SYSTEMTIME
If
FileTimeToLocalFileTime
(
ft, datelocale) =
0
Then
Exit
Function
If
FileTimeToSystemTime
(
datelocale, datesys) =
0
Then
Exit
Function
FileTimeToDate =
CDate
(
datesys.wDay
&
" "
&
datesys.wMonth
&
" "
&
datesys.wYear
&
" "
&
_
datesys.wHour
&
":"
&
datesys.wMinute
&
":"
&
datesys.wSecond
)
End
Function
La partie principale du code est assez simple :
Dim
findData As
WIN32_FIND_DATA, hFind As
Long
hFind =
FindFirstFile
(
"c:\autoexec.bat"
, findData)
If
hFind =
INVALID_HANDLE_VALUE Then
Exit
Sub
FindClose hFind
MsgBox
"Créé le : "
&
FileTimeToDate
(
findData.ftCreationTime
)
MsgBox
"Modifié le : "
&
FileTimeToDate
(
findData.ftLastWriteTime
)
MsgBox
"Accédé le : "
&
FileTimeToDate
(
findData.ftLastAccessTime
)
Pour terminer, voici la version avec le FileSystemObject :
Dim
fso As
FileSystemObject, f As
File
Set
fso =
New
FileSystemObject
On
Error
GoTo
fin
Set
f =
fso.GetFile
(
"c:\autoexec.bat"
)
MsgBox
"Créé le : "
&
f.DateCreated
MsgBox
"Modifié le : "
&
f.DateLastModified
MsgBox
"Accédé le : "
&
f.DateLastAccessed
Set
f =
Nothing
fin
:
Set
fso =
Nothing
Lien : FAQ VB
On peut utiliser la fonction Dir() :
Dim
NomFichier as
string
NomFichier=
Dir
(
"C:\NomDuRepertoire\*.txt"
)
Ici, NomFichier reçoit "UnFichier.txt" le premier fichier texte d'extension txt du répertoire.
Vous pouvez rappeler la ligne qui suit pour avoir le nom du fichier suivant :
NomFichier=
Dir
(
"C:\NomDuRepertoire\*.txt"
)
Lorsqu'il n'y aura plus de fichier d'extension txt, la variable NomFichier sera nulle.
If
Dir
(
"c:\temp\Erreurs.tmp"
, vbHidden) <>
""
Then
' Le fichier existe (vbHidden permet de le retrouver même s'il est caché)
End
If
Lien : FAQ VB
Il suffit de référencer la bibliothèque Micosoft Scripting Runtime afin de pouvoir utiliser l'objet FileSystemObject.
Ensuite, on peut utiliser un code comme celui-ci :
Dim
fso as
new
scripting.filesystemobject
Dim
fld as
scripting.folder
Set
fld =
fso.getfolder
(
"c:\Chemin\EtNomDu\Dossier"
)
Msgbox
fld.Size
Set
fld =
nothing
Set
fso =
nothing
Debug.Print
FileLen
(
"nomdufichier"
) 'Affiche en octets la taille du fichier
Lien : FAQ VB
Voici une méthode simple utilisant le FileSystemObject. Placez ce code dans un module :
Public
Enum UniteMemoire
octets =
1
kiloOctets =
2
megaOctets =
3
End
Enum
Public
Function
TailleRepertoire
(
f As
Folder, Optional
unite As
UniteMemoire =
1
) As
Long
Dim
s As
Long
s =
f.Size
Select
Case
unite
Case
2
:
TailleRepertoire =
Int
(
s /
1024
)
Case
3
:
TailleRepertoire =
Int
(
s /
1048576
)
Case
Else
:
TailleRepertoire =
s
End
Select
End
Function
Un exemple d'utilisation :
Private
Sub
Test
(
)
Dim
fs As
FileSystemObject, f As
Folder, strTaille As
String
Set
fs =
New
FileSystemObject
Set
f =
fs.GetFolder
(
"c:\windows"
)
strTaille =
Format
(
TailleRepertoire
(
f), "##,##0 octets"
) &
vbCrLf
&
_
Format
(
TailleRepertoire
(
f, kiloOctets), "##,##0 Ko"
) &
vbCrLf
&
_
Format
(
TailleRepertoire
(
f, megaOctets), "##,##0 Mo"
)
MsgBox
strTaille
End
Sub
Lien : FAQ VB
Pour obtenir les propriétés d'un PDF (nom, titre, etc.), il faut lire le fichier en mode binary. L'utilisation des RegExp permettra d'accéder aux informations recherchées. C'est ce que fait la fonction suivante :
Function
GetPDFTitle
(
ByVal
strFic As
String
, strObj As
String
) As
String
Dim
fic As
Integer
Dim
strExp As
String
Dim
strBuff As
String
*
1024
Dim
i As
Integer
Dim
reg As
VBScript_RegExp_55.RegExp
Dim
Match As
VBScript_RegExp_55.Match
Dim
Matches As
VBScript_RegExp_55.MatchCollection
Set
reg =
New
VBScript_RegExp_55.RegExp
reg.Global
=
True
reg.MultiLine
=
False
reg.IgnoreCase
=
True
reg.Pattern
=
"/"
&
strObj &
"\((.*)\)"
Reset
fic =
FreeFile
Open strFic For
Binary Access Read As
#fic
Do
While
Not
EOF
(
fic)
Get
#fic, , strBuff
strExp =
strExp &
strBuff
If
reg.Test
(
strExp) =
True
Then
Set
Matches =
reg.Execute
(
strExp)
For
Each
Match In
Matches
GetPDFTitle =
Match.SubMatches
(
0
)
Next
Match
Exit
Function
Else
strExp =
right
(
strExp, 1024
)
End
If
Loop
Reset
Set
Match =
Nothing
Set
Matches =
Nothing
Set
reg =
Nothing
End
Function
Exemple d'utilisation :
getpdftitle
(
"d:\temp\20060331164202.pdf"
, "Title"
)
Il est possible de remplacer title par un des champs suivants :
- CreationDate
- ModDate
- Title
- Creator
- Author
Lien : Tutoriel : Le PDF gratuit pour Access
Lien : Les expressions rationnelles / régulières dans Access par la pratique
Au moyen d'une fonction qui tente d'ouvrir un fichier en écriture, en cas d'erreur retournée, cela indique que le fichier est déjà ouvert, dans le cas contraire, on considère qu'il est fermé.
Function
IsFileOpen
(
ByVal
strFic As
String
) As
Boolean
Dim
fic As
Integer
On
Error
Resume
Next
fic =
FreeFile
(
)
Open strFic For
Input Access Read Lock Read Write As
fic
If
Err
.Number
=
0
Then
IsFileOpen =
False
Close fic
Else
IsFileOpen =
True
End
If
End
Function
Voici une fonction à ajouter dans un nouveau module qui vous permettra de compter le nombre de fichiers d'une ou plusieurs extensions voulues dans répertoire donné :
Function
nbfich
(
chemin As
String
, ParamArray termin
(
) As
Variant
) As
Long
Dim
fichier As
String
Dim
extension As
Variant
Dim
compteur As
Long
For
Each
extension In
termin
fichier =
dir
(
chemin &
"\*."
&
extension)
Do
Until
fichier =
""
compteur =
compteur +
1
fichier =
dir
Loop
Next
extension
nbfich =
compteur
End
Function
Voici comment appeler cette fonction :
nbfich
(
"c:\mesimages"
,"gif"
,"bmp"
,"pcx"
)
Vous pouvez mettre une ou plusieurs extensions séparées par des virgules.