Lire et modifier les attributs de date d'un fichier

Description

Ce programme a pour objectif de lire (et pourquoi pas, de modifier) les dates qui apparaissent lors d'un affichage des propriétés du fichier. A toutes fins utiles.
La portion de code affichée ici ne montre que les routines intéressantes, mais en ZIP figure une application complète.

Source / Exemple :


Option Explicit

'==============================================================================
'   Constantes

Public Const cstrAppTitle = "Dates de fichier"

Private Const GENERIC_READ = &H80000000             'Accès en lecture
Private Const GENERIC_WRITE = &H40000000            'Acces en écriture
Private Const INVALID_HANDLE_VALUE = -1             'Identificateur non valide
Private Const MAX_PATH = 260                        'Longueur de chemin maximum
Private Const OFN_HIDEREADONLY = &H4                'Masquer "Lecture seule"
Private Const OFN_NODEREFERENCELINKS = &H100000     'Ouvrir le fichier .LNK
                                                    'et non le fichier pointé
Private Const OPEN_EXISTING = 3                     'Ne créée pas de fichier

'==============================================================================
'   Structures

'Date fichier
Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type

'Informations ouverture/sauvegarde de fichier
Private Type OPENFILENAME
        lStructSize As Long
        hWndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
End Type

'Attributs de sécurité (inutile sous Windows 9x)
Private Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
End Type

'Date fichier, format converti
Public 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

'==============================================================================
'   Déclarations API

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Declare Function LocalFileTimeToFileTime Lib "kernel32" (lpLocalFileTime As FILETIME, lpFileTime As FILETIME) As Long
Private Declare Function SetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function SystemTimeToFileTime Lib "kernel32" (lpSystemTime As SYSTEMTIME, lpFileTime As FILETIME) As Long

'==============================================================================
'   Fonctions membres

Public Function GetOpenFile(ByVal hWndOwner As Long) As String
'Affiche la boîte "Ouvrir", retourne le chemin d'accès ou une chaîne vide sur
'annulation, consulter la doc pour les infos sur les paramètres, sinon il y en
'a pour 12 pages de commentaires

    Dim ofn As OPENFILENAME
    Dim strFile As String * MAX_PATH, lngFile As Long
    Dim lngFileExtension As Long
    Dim lngFileOffset As Long, lngError As Long
       
    lngFile = MAX_PATH
    
    ofn.lStructSize = Len(ofn)
    ofn.hWndOwner = hWndOwner   'Propriétaire de la fenêtre
    ofn.hInstance = 0&
    ofn.lpstrFilter = "Tous les fichiers (*.*)" + vbNullChar + "*.*" + _
        vbNullChar + vbNullChar
    ofn.lpstrCustomFilter = vbNullString
    ofn.nMaxCustFilter = 0&
    ofn.nFilterIndex = 1
    ofn.lpstrFile = strFile
    ofn.nMaxFile = lngFile
    ofn.lpstrFileTitle = vbNullString
    ofn.nMaxFileTitle = 0&
    ofn.lpstrInitialDir = vbNullString
    ofn.lpstrTitle = "Ouvrir un fichier"
    ofn.flags = OFN_HIDEREADONLY Or OFN_NODEREFERENCELINKS
    ofn.nFileOffset = lngFileOffset
    ofn.nFileExtension = lngFileExtension
    ofn.lpstrDefExt = vbNullString
    ofn.lCustData = 0&
    ofn.lpfnHook = 0&
    ofn.lpTemplateName = 0&
    
    lngFile = GetOpenFileName(ofn)
    If lngFile <> 0 Then
        'On a cliqué sur OK
        'Un peu galère en VB de trouver la fin d'une chaîne C.
        'Dans l'instruction InStr, on part de l'indicateur de l'extension pour
        'aller plus vite
        GetOpenFile = Left(ofn.lpstrFile, InStr(ofn.nFileExtension, _
            ofn.lpstrFile, vbNullChar) - 1)
    Else
        'Information de débogage. Consulter CDERR.H pour une info sur le
        'code d'erreur (si <> 0)
        lngError = CommDlgExtendedError()
        
        GetOpenFile = ""
        If lngError <> 0 Then
            'lngError contient le code d'erreur
            Debug.Assert False
        End If
    End If
    
End Function

Public Function GetFileTimes(strFile As String, stCreation As SYSTEMTIME, _
    stLastAccess As SYSTEMTIME, stLastWrite As SYSTEMTIME) As Boolean
    'Récupération des dates du fichier, renvoie True si OK
    'Les informations de date sont renvoyés par référence
    
    Dim ftCreation As FILETIME, ftLastAccess As FILETIME
    Dim ftLastWrite As FILETIME, lnghFile As Long
    
    Debug.Assert strFile <> ""
    
    lnghFile = OpenFile(strFile, False)
    If lnghFile = INVALID_HANDLE_VALUE Then
        MsgBox "Impossible d'ouvrir le fichier " + strFile, vbExclamation
        'Voir la fonction OpenFile() en mode débogage pour le code d'erreur
        Exit Function
    End If
    
    'Bon, ben maintenant ça roule tout seul
    GetFileTime lnghFile, ftCreation, ftLastAccess, ftLastWrite
    CloseHandle lnghFile
    
    'Conversion Temps Universel -> Temps local
    FileTimeToLocalFileTime ftCreation, ftCreation
    FileTimeToLocalFileTime ftLastAccess, ftLastAccess
    FileTimeToLocalFileTime ftLastWrite, ftLastWrite
    
    'Conversion temps binaire -> temps "humain" (voir les structures FILETIME
    'et SYSTEMTIME pour comprendre ce que je veux dire)
    FileTimeToSystemTime ftCreation, stCreation
    FileTimeToSystemTime ftLastAccess, stLastAccess
    FileTimeToSystemTime ftLastWrite, stLastWrite
    
    GetFileTimes = True
    
End Function

Private Function OpenFile(strFileName As String, blnAccess As Boolean) As Long
    'Ouverture d'un fichier strFileName avec blnAccess à True pour l'écriture,
    'à False pour lecture seule.
    'Renvoi de l'identificateur de fichier
    
    Dim sa As SECURITY_ATTRIBUTES
    Dim lngError As Long, lnghFile As Long
    
    Debug.Assert strFileName <> ""
    
    'Sécurité par défaut (non utilisé sous Windows 9x).
    sa.nLength = Len(sa)
    sa.bInheritHandle = 0&
    
    'Le fichier est ouvert en accès exclusif.
    'Modifier le paramètre dwShareMode pour modifier ou lire des fichiers déjà
    'ouverts par d'autres programmes
    lnghFile = CreateFile(strFileName + vbNullChar, _
        IIf(blnAccess, GENERIC_WRITE, GENERIC_READ), 0&, sa, _
        OPEN_EXISTING, 0&, 0&)
        
    'Code de débogage, voir WINERROR.H pour la signification
    lngError = GetLastError()
    
    OpenFile = lnghFile
End Function

Public Function SetFileTimes(strFile As String, stCreation As SYSTEMTIME, _
    stLastAccess As SYSTEMTIME, stLastWrite As SYSTEMTIME) As Boolean
    'Affectation des dates du fichier, renvoie True si OK
    
    Dim ftCreation As FILETIME, ftLastAccess As FILETIME
    Dim ftLastWrite As FILETIME, lnghFile As Long
    Dim blnSuccess As Boolean
    
    Debug.Assert strFile <> ""  'Alors, on a perdu sa maman ?
    
    'Conversion Temps "humain" -> Temps machine
    SystemTimeToFileTime stCreation, ftCreation
    SystemTimeToFileTime stLastAccess, ftLastAccess
    SystemTimeToFileTime stLastWrite, ftLastWrite
    
    'Conversion temps local -> Temps universel
    LocalFileTimeToFileTime ftCreation, ftCreation
    LocalFileTimeToFileTime ftLastAccess, ftLastAccess
    LocalFileTimeToFileTime ftLastWrite, ftLastWrite
    
    lnghFile = OpenFile(strFile, True)
    If lnghFile = INVALID_HANDLE_VALUE Then
        MsgBox "Impossible d'ouvrir le fichier " + strFile, vbExclamation, _
            cstrAppTitle
        'Voir la fonction OpenFile en débogage pour le code d'erreur
        Exit Function
    End If
    
    'SetFileTime renvoie True si OK
    blnSuccess = SetFileTime(lnghFile, ftCreation, ftLastAccess, ftLastWrite) <> 0
    
    'Fermeture du fichier
    CloseHandle lnghFile
    
    SetFileTimes = blnSuccess
    
End Function

Conclusion :


Dans le fichier ZIP, vous trouverez :
- Une feuille présentant l'interface utilisateur
- Un module comprenant les routines (réutilisable dans une autre appli).

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.