FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Fichiers et répertoires→Informations- 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 LongLes 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 FunctionLa 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 = NothingLien : 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 IfLien : 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 = nothingDebug.Print FileLen("nomdufichier") 'Affiche en octets la taille du fichierLien : 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 FunctionUn 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 SubLien : 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 FunctionExemple 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 FunctionVoici 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 FunctionVoici comment appeler cette fonction :
nbfich("c:\mesimages","gif","bmp","pcx")Vous pouvez mettre une ou plusieurs extensions séparées par des virgules.



