Page 1 sur 1

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

Publié : mer. 26/mai/2004 19:00
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.

Publié : mer. 26/mai/2004 20:53
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
:)

Publié : mer. 26/mai/2004 23:20
par nico
J'ai mis le code sous la forme d'une procédure dans Trucs et Astuces. :)

Publié : jeu. 27/mai/2004 16:17
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

Publié : jeu. 27/mai/2004 20:18
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

Publié : ven. 28/mai/2004 9:29
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.

Publié : ven. 28/mai/2004 16:24
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