Récupérer la date et l'heure d'un dossier/fichier

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nemo
Messages : 4
Inscription : mer. 26/mai/2004 16:50

Récupérer la date et l'heure d'un dossier/fichier

Message par nemo »

Bonjour à tous,

Je cherche jusqu'ici sans succès à récupérer dans une variable la date et l'heure de création d'un fichier ou d'un dossier.
Les commande de type File et Filesystem ne le permettent pas (j'ai peut-être mal regardé hein...)

Un autre moyen ?

Merci d'avance.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Autant le dire tout de suite, c'est chiant, faut convertir deux fois les données pour avoir les dates et heures locales :roll:

Une petite routine s'impose, en attendant voici le code:

Code : Tout sélectionner

;Heure et Date Locale
;Nico
;Le 26/05/04

; Structure Filetime
;   dwLowDateTime.l
;   dwHighDateTime.l
; EndStructure
; 
; Structure SystemTime 
;   wYear.w
;   wMonth.w
;   wDayOfWeek.w
;   wDay.w 
;   wHour.w
;   wMinute.w
;   wSecond.w
;   wMilliseconds.w
; EndStructure  

Creation1.Filetime
DernierAcces1.Filetime
DerniereConsultation1.Filetime

Creation2.Filetime
DernierAcces2.Filetime
DerniereConsultation2.Filetime

Creation3.SystemTime
DernierAcces3.SystemTime
DerniereConsultation3.SystemTime

Hfile.l= OpenFile(0,"c:\texte.txt")
If Hfile
  If GetFileTime_(Hfile,@Creation1, @DernierAcces1, @DerniereConsultation1)
    ;bon là, j'arrète les if....
     FileTimeToLocalFileTime_(Creation1, @Creation2)
     FileTimeToLocalFileTime_(DernierAcces1, @DernierAcces2)
     FileTimeToLocalFileTime_(DerniereConsultation1, @DerniereConsultation2)
    
    If FileTimeToSystemTime_(Creation2, @Creation3)
      MessageRequester("Info Creation",Str(Creation3\wDay)+"  -  "+Str(Creation3\wHour)+":"+Str(Creation3\wMinute))
      
      If FileTimeToSystemTime_(DernierAcces2, @DernierAcces3)
        MessageRequester("Info Dernier Acces",Str(DernierAcces3\wDay)+"  -  "+Str(DernierAcces3\wHour)+":"+Str(DernierAcces3\wMinute))
        
        If FileTimeToSystemTime_(DerniereConsultation2, @DerniereConsultation3)
          MessageRequester("Info Dernière Modification",Str(DerniereConsultation3\wDay)+"  -  "+Str(DerniereConsultation3\wHour)+":"+Str(DerniereConsultation3\wMinute))
          
        EndIf
      EndIf
    EndIf
  EndIf
closefile(0)
EndIf
:)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai mis le code sous la forme d'une procédure dans Trucs et Astuces. :)
nemo
Messages : 4
Inscription : mer. 26/mai/2004 16:50

Message par nemo »

Merci à toi nico (on a le même prénom :wink: )

Effectivement ça promet d'être bien chiant pour mettre ça en oeuvre dans un ListIconGadget. Quoiqu'il en soit ton code fonctionne impec et m'ouvre certaines perspectives que j'avais négligées.

Encore merci.
:D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Nemo,

voici un petit code qui pourrait t'inspirer (listicongadget avec non de fichier et date) - code simple juste pour un dossier et ici C:\


Code : Tout sélectionner

Structure SHFILEINFO_Ok ; la structure SHFILEINFO PB est fausse 
   hIcon.l 
   iIcon.l 
   dwAttributes.l 
   szDisplayName.b[#MAX_PATH] 
   szTypeName.b[80] 
EndStructure 


Structure LVITEM ; La structure LV_ITEM est incomplète 
   Mask.l 
   iItem.l 
   iSubItem.l 
   State.l 
   stateMask.l 
   pszText.l 
   cchTextMax.l 
   iImage.l 
   lParam.l 
   iIndent.l 
   iGroupId.l 
   cColumns.l 
   puColumns.l 
EndStructure 

#Date = "dd'/'MM'/'yyyy"

#Fichier_Courant = 100

If OpenWindow(0, 0, 0, 600, 400, #PB_Window_WindowCentered | #PB_Window_SystemMenu, "Mini Exploreur de fichiers") 
   If CreateGadgetList(WindowID()) 
      IdListIcon = ListIconGadget(0, 10, 10, 580, 380, "Fichier", 575 / 3, #LVS_SHAREIMAGELISTS) 
      AddGadgetColumn(0, 1, "Type", 575 / 3) 
      AddGadgetColumn(0, 2, "Date", 575 / 3) 

      Dossier.s ="C:\"   ; dossier à examiner
      
      ; Assign la listImage système à la listIcon 
      CurrentDirectory.s = Space(#MAX_PATH) 
      GetSystemDirectory_(CurrentDirectory, #MAX_PATH) 
      hImageListS.l = SHGetFileInfo_(CurrentDirectory, 0, @InfosFile.SHFILEINFO_Ok, SizeOf(SHFILEINFO_Ok), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON) 
      ImageList_SetBkColor_(hImageListS, #CLR_NONE) 
      SendMessage_(IdListIcon, #LVM_SETIMAGELIST, #LVSIL_SMALL, hImageListS) 
      NomFichier$ = Space(256) 

      FileInfos.WIN32_FIND_DATA ; filetime
      String1.s = Space(256) : FileDateTime.s = String1
      If ExamineDirectory(0, Dossier, "*.*")          
         Repeat 
            Type = NextDirectoryEntry() 
            If Type 
            NomFichier$ = DirectoryEntryName() 
            
            ; on récupère les infos sur l'icône et sur la description du fichier 
            SHGetFileInfo_(Dossier + NomFichier$, 0, @InfosFile, SizeOf(SHFILEINFO_Ok), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON | #SHGFI_TYPENAME) 
            
            ; on affiche le 1er élément dans la listicongadget, soit le fichier + l'icône 
            
            VarList.LVITEM\Mask = #LVIF_TEXT | #LVIF_IMAGE ; ; mask défini le type de données | #LVIF_PARAM 
            VarList\iImage = InfosFile\iIcon ; l'index de l'icon dans la liste système 
            VarList\pszText = @NomFichier$ ; la chaîne à afficher 
            VarList\iSubItem = 0 ; indique que c'est le premier élément et pas un sous-élément 
            
            ; on envoie le message pour afficher le premier élément 
            SendMessage_(IdListIcon, #LVM_INSERTITEM, 0, @VarList) 
            
            ; on envoie le message pour afficher le deuxième élément 
            VarList\Mask = #LVIF_TEXT 
            VarList\pszText = @InfosFile\szTypeName[0] ; la chaîne à afficher 
            VarList\iSubItem = 1 ; indique que c'est le deuxième 

            ; on envoie le message 
            SendMessage_(IdListIcon, #LVM_SETITEM, 0, @VarList) 

            
            ; on récupère la date du fichier
            ID = OpenFile(#Fichier_Courant, Dossier+NomFichier$)
            If ID
               GetFileTime_(ID, lpCreationTime.FILETIME,  lpLastAccessTime.FILETIME, lpLastWriteTime.FILETIME)
               CloseFile(#Fichier_Courant)
               FileTimeToLocalFileTime_(lpLastWriteTime, @OutPut.l)
               FileTimeToSystemTime_(@OutPut, @OutPutSystemTime.SYSTEMTIME)
               GetDateFormat_(2048, 0, @OutPutSystemTime, #Date, @String1, 254)
               GetTimeFormat_(2048, #TIME_FORCE24HOURFORMAT, @OutPutSystemTime, 0, @FileDateTime.s, 254)
               String1 + "  " + FileDateTime
               VarList\iSubItem = 2; colonne 3
               VarList\pszText = @String1
               SendMessage_(IdListIcon, #LVM_SETITEM, 0, @VarList)
            EndIf 
            EndIf 
         Until Type = 0 

      EndIf 
      
   EndIf 
    
    
   Repeat 
      
   Until WaitWindowEvent() = #PB_EventCloseWindow 
EndIf 
End
nemo
Messages : 4
Inscription : mer. 26/mai/2004 16:50

Message par nemo »

Joli code Denis, merci beaucoup.

Je vais me faire une joie de le décortiquer pour essayer de le comprendre. (Je crois qu'on a pas le même niveau là :? )

Je te fais signe dans quelques années quand j'aurai tout intégré :D .
En tous cas c'est exactement ce dont j'avais besoin.

Encore merci.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fait chose par chose et pose des questions, ce code n'est pas celui que j'utilise perso car il faut ruser pour récupérer la date du fichier (il manque vraiment une commande DirectoryEntryDate() pour la Date et DirectoryEntryTime() pour l'heure du fichier.

J'utilise directement les API windows FindFirstFile_() et FindNextFile_()


Le plus serait donc d'intégrer le tri de chaque colonne en affichant les dossiers avants les fichiers par ordre alphabétique ou inverse, le tri par date et par type. Peut-être mon prochain post si j'ai un peu de temps
Répondre