Newsgroup: it.comp.lang.visual-basic
Titolo: Ricavare la data/ora di ultima modifica e ultimo accesso ad un file

Ciao a tutti.
Dalla sezione "Progettati per Te" del sito
http://members.xoom.com/it_lang_vb/prj1.htm
  ho scaricato FileTimes.zip
per ricavare la data/ora di ultima modifica e ultimo accesso ad un file.
Ho eseguito l'esempio su una macchina Windows NT ottenendo solamente la
data di modifica, mentre su una macchina Windows 95 non ho ricavato
niente.
Come posso fare?
Grazie,
                                Daniela.
DETTAGLI:
Nell'esempio FileTimes.zip viene utilizzata la dll GetFileTime:
Declare Function GetFileTime Lib "Kernel32" (ByVal hFile As Long,
lpCreationTime As FILETIME, lpLastAccessTime As FILETIME,
lpLastWriteTime As FILETIME) As Long
La chiamata alla dll è la seguente:
Dim dtCreation As FILETIME
Dim dtModify As FILETIME
Dim dtAccess As FILETIME
a = GetFileTime(fp, dtCreation, dtAccess, dtModify)
CODICE:
Il codice completo è il seguente:
Global Const FILE_ATTRIBUTE_ARCHIVE = &H20
Global Const FILE_ATTRIBUTE_COMPRESSED = &H800
Global Const FILE_ATTRIBUTE_DIRECTORY = &H10
Global Const FILE_ATTRIBUTE_HIDDEN = &H2
Global Const FILE_ATTRIBUTE_NORMAL = &H80
Global Const FILE_ATTRIBUTE_READONLY = &H1
Global Const FILE_ATTRIBUTE_SYSTEM = &H4
Global Const FILE_ATTRIBUTE_TEMPORARY = &H100
Global Const GENERIC_ALL = &H10000000
Global Const GENERIC_EXECUTE = &H20000000
Global Const GENERIC_READ = &H80000000
Global Const GENERIC_WRITE = &H40000000
Public Const OPEN_EXISTING = 3
Public Const FILE_SHARE_READ = &H1
Public Const INVALID_HANDLE_VALUE = -1
Public Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
End Type
Public Type BY_HANDLE_FILE_INFORMATION
        dwFileAttributes As Long
        ftCreationTime As FILETIME
        ftLastAccessTime As FILETIME
        ftLastWriteTime As FILETIME
        dwVolumeSerialNumber As Long
        nFileSizeHigh As Long
        nFileSizeLow As Long
        nNumberOfLinks As Long
        nFileIndexHigh As Long
        nFileIndexLow As Long
End Type
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
'
' Dichiarazione API di windows
'
Public Declare Function GetFileTime Lib "Kernel32" (ByVal hFile As Long,
lpCreationTime As FILETIME, lpLastAccessTime As FILETIME,
lpLastWriteTime As FILETIME) As Long
Public Declare Function FileTimeToSystemTime Lib "Kernel32" (lpFileTime
As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Public Declare Function CloseHandle& Lib "Kernel32" (ByVal hObject As
Long)
Public Declare Function CreateFile Lib "Kernel32" Alias "CreateFileA"
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwSharedMode As Long, lpSecurityaAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal
hTemplateFile As Long) As Long
'-----------------------------------------------------------
' SUB: GetFileInfo
'
' Dato il path del file, restituisce tre stringhe indicanti la data e
l'ora di
' creazione, di modifica e dell'ultimo accesso
'
' PARAMETRI: il nome del file (input), la data/ora di creazione (output)
'            la data/ora di modifica (output), la data/ora di accesso
(output)
'
' VALORE DI RITORNO:
'
'-----------------------------------------------------------
Public Sub GetFileInfo(ByVal FileName As String, stCreation As String,
stModify As String, stAccess As String)
    Dim fp As Long
    Dim dtCreation As FILETIME
    Dim dtModify As FILETIME
    Dim dtAccess As FILETIME
    Dim st As SYSTEMTIME
    Dim a As Long
    fp = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0,
OPEN_EXISTING, 0, 0)
    If fp <> INVALID_HANDLE_VALUE Then
        a = GetFileTime(fp, dtCreation, dtAccess, dtModify)
        FileTimeToSystemTime dtCreation, st
        stCreation = Format(st.wDay & "/" & st.wMonth & "/" & st.wYear,
"Short Date") _
                     & " " & Format(st.wHour & ":" & st.wMinute & ":" &
st.wSecond, "hh.mm.ss")
        FileTimeToSystemTime dtAccess, st
        stAccess = Format(st.wDay & "/" & st.wMonth & "/" & st.wYear,
"Short Date") _
                     & " " & Format(st.wHour & ":" & st.wMinute & ":" &
st.wSecond, "hh.mm.ss")
        FileTimeToSystemTime dtModify, st
        stModify = Format(st.wDay & "/" & st.wMonth & "/" & st.wYear,
"Short Date") _
                     & " " & Format(st.wHour & ":" & st.wMinute & ":" &
st.wSecond, "hh.mm.ss")
    End If
    CloseHandle fp
End Sub '*** GetFileInfo ***

La chiamata alla dll è la seguente:
GetFileTime non e' una DLL, e' una funzione delle API di Windows.
Visto che pare che non conosci la differenza, te la spiego (ti chiedo scusa
se la sai, ma dal tuo messaggio sembrerebbe proprio di no):
DLL : Dynamic Linked Library
e' un file binario, compilato in codice macchina, che contiene (come dice il
nome) una "libreria" di funzioni richiamabili da un programma EXE
(eseguibile), o da altre DLL.
API: Application Programming Interface (Interfaccia di programmazione per le
applicazioni, piu' o meno :-)
si tratta dell'insieme di funzioni che un sistema operativo (Windows) o una
applicazione, rende pubbliche, e quindi chiamabili ed utilizzabili da altre
applicazioni, per effettuare talune operazioni.
Le "API" (o meglio "la" API) per antonomasia sono quelle di Windows, ossia
l'insieme di funzioni che permettono a qualsiasi applicazione di far
eseguire al sistema una operazione (creare un file, visualizzare una
finestra, disegnare una linea a video, etc...).
2) Dato che hai gia' dato l'indirizzo del Sito Comune, su cui si trova il
file con il codice sorgente, sarebbe meglio che evitassi di allegare tutto
il codice al messaggio.
Questo per mantenere bassa la dimensione del messaggio stesso (che, ti
ricordo, quasi tutti noi scarichiamo tramite modem), con beneficio e
sollievo alla bolletta telefonica di tutti noi.
P.S. Non prenderla come critica "selvaggia", volevo solo farti notare
qualcosa che forse non sai.
ciao
--
Roal Zanazzi
z...@iol.it

...


-------------------
Scusate la domanda che potrebbe apparire banale: penso anch'io che le API
facciano molto "professionista", come disse qualcuno sul NG qualche tempo
fa, ma, per ottenere la data e l'ora dell'ultima modifica di un file, non è
molto più semplice utilizzare l'istruzione VB:
FileDateTime
che, secondo quanto riportato nella Guida in linea, "Restituisce un valore
Variant (Date) che indica la data e l'ora in cui un file è stato creato o
modificato."?
Ciao
Marco Minerva
http://www.geocities.com/SiliconValley/Foothills/7260
http://www.armaditaggia.com/marco


Si, ma FileDateTime() ti ritorna solo la data di ultima modifica, mentre
nella FAT32 sono disponibili anche le informazioni sulla data di creazione e
di ultimo accesso (concetto differente da ultima modifica).
Quindi, l'utilizzo di FileDateTime() o delle API, dipende solo dalle
informazioni che si vogliono avere.
--
Roal Zanazzi
z...@iol.it