Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Récupérer la date de dernière modification d'un fichier sur un serveur FTP.

1 réponse
Avatar
JMV
Bonjour,

Voici un problème que je n'arrive pas à résoudre et pour lequel je sollicite
votre expertise.

J'essaie de récupérer la date de dernière modification d'un fichier sur un
serveur FTP.

Pour cela, j'utilise le code suivant :



Module TEST

Public Const MAX_PATH As Short = 260

Public Structure FILETIME
Public dwLowDateTime As Integer
Public dwHighDateTime As Integer
End Structure

Public Structure WIN32_FIND_DATA
Public dwFileAttributes As Integer
Public ftCreationTime As FILETIME
Public ftLastAccessTime As FILETIME
Public ftLastWriteTime As FILETIME
Public nFileSizeHigh As Integer
Public nFileSizeLow As Integer
Public dwReserved0 As Integer
Public dwReserved1 As Integer

<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.Unm
anagedType.ByValTStr, SizeConst:=MAX_PATH)> _
Public cFileName As String

<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.Unm
anagedType.ByValTStr, SizeConst:=14)> _
Public cAlternateFileName As String
End Structure

Public Structure SYSTEMTIME
Public wYear As Integer
Public wMonth As Integer
Public wDayOfWeek As Integer
Public wDay As Integer
Public wHour As Integer
Public wMinute As Integer
Public wSecond As Integer
Public wMilliseconds As Integer
End Structure

Public Declare Function FileTimeToLocalFileTime Lib "kernel32" ( _
ByVal lpFileTime As FILETIME, _
ByVal lpLocalFileTime As FILETIME) As Long

Public Declare Function FileTimeToSystemTime Lib "kernel32" ( _
ByVal lpFileTime As FILETIME, _
ByVal lpSystemTime As SYSTEMTIME) As Long


Function testdate1()

Dim fData As WIN32_FIND_DATA
Dim St As SYSTEMTIME
Dim Ft1 As FILETIME
Dim Ft2 As FILETIME

' ****** incomplet ********
' Connexion sur le serveur FTP ...
internet_ok = InternetOpen("PutFtpFile", 1, "", "", 0)
ftp_ok = InternetConnect(internet_ok, serveur_ftp, 21, login,
mot_passe, 1, &H8000000, 0)
select_rep = FtpSetCurrentDirectory(ftp_ok, rep)
FtpFindFirstFile(ftp_ok, "*.*", fData, 0, 0)

' ******

Ft1 = fData.ftLastWriteTime

' Conversion File Time en Local File Time

retour1 = FileTimeToLocalFileTime(Ft1, Ft2)

End Function



End Module



Lorsque je fais tourner ce code, je récupère bien dans la structure fData
les paramètres qui m'interessent :

fData.cFileName : Contient le nom du fichier concerné,
fData.nFileSizeLow : Contient la taille du fichier.
fData.ftCreationTime et fData.ftLastAccessTime = 0 (ce qui d'après ce que
j'ai lu sur Internet semble
cohérent).

En revanche, fData.fLastWriteTime n'est pas vide.
La structure FILETIME associée à fLastWriteTime contient les valeurs :

dwHighDateTime : 29731569
dwLowDateTime : -1208734720

Ceci m'amène à vous poser une première question : Est-ce que les valeurs
ci-dessus vous
semblent correctes ?

Lorsque j'exécute le code de la fonction testdate1(), j'obtient lors de
l'exécution
de FileTimeToLocalFileTime(Ft1, Ft2) le message d'erreur suivant :

"Une exception non gérée du type 'System.NullReferenceException' s'est
produite dans
toto.exe.
La référence d'objet n'est pas définie à une instance d'un objet".


Voila.

Merci d'avance pour toute aide que vous pourrez m'apporter.


Jean-Marc

1 réponse

Avatar
JMV
Bonjour,

Un intervenant sur un autre forum m'a proposé cette solution qui résoud le
problème.

J'utilise la fonction ci-dessous en lei et place de la fonction
FileTimeToLocalFileTime.

Private Function FileTimeToDate(ByVal ft As FILETIME) As Date

' FILETIME units are 100s of nanoseconds.

Const TICKS_PER_SECOND = 10000000

Dim lo_time As Double

Dim hi_time As Double

Dim seconds As Double

Dim hours As Double

Dim the_date As Date

' Get the low order data.

If ft.dwLowDateTime < 0 Then

lo_time = 2 ^ 31 + (ft.dwLowDateTime And &H7FFFFFFF)

Else

lo_time = ft.dwLowDateTime

End If

' Get the high order data.

If ft.dwHighDateTime < 0 Then

hi_time = 2 ^ 31 + (ft.dwHighDateTime And _

&H7FFFFFFF)

Else

hi_time = ft.dwHighDateTime

End If

' Combine them and turn the result into hours.

seconds = (lo_time + 2 ^ 32 * hi_time) / _

TICKS_PER_SECOND

hours = CLng(seconds / 3600)

seconds = seconds - hours * 3600

' Make the date.

the_date = DateAdd("h", hours, "1/1/1601 0:00 AM")

the_date = DateAdd("s", seconds, the_date)

FileTimeToDate = the_date

End Function



Jean-Marc








"JMV" a écrit dans le message de
news:

Bonjour,

Voici un problème que je n'arrive pas à résoudre et pour lequel je


sollicite
votre expertise.

J'essaie de récupérer la date de dernière modification d'un fichier sur un
serveur FTP.

Pour cela, j'utilise le code suivant :



Module TEST

Public Const MAX_PATH As Short = 260

Public Structure FILETIME
Public dwLowDateTime As Integer
Public dwHighDateTime As Integer
End Structure

Public Structure WIN32_FIND_DATA
Public dwFileAttributes As Integer
Public ftCreationTime As FILETIME
Public ftLastAccessTime As FILETIME
Public ftLastWriteTime As FILETIME
Public nFileSizeHigh As Integer
Public nFileSizeLow As Integer
Public dwReserved0 As Integer
Public dwReserved1 As Integer




<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.Unm
anagedType.ByValTStr, SizeConst:=MAX_PATH)> _
Public cFileName As String




<System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.Unm
anagedType.ByValTStr, SizeConst:)> _
Public cAlternateFileName As String
End Structure

Public Structure SYSTEMTIME
Public wYear As Integer
Public wMonth As Integer
Public wDayOfWeek As Integer
Public wDay As Integer
Public wHour As Integer
Public wMinute As Integer
Public wSecond As Integer
Public wMilliseconds As Integer
End Structure

Public Declare Function FileTimeToLocalFileTime Lib "kernel32" ( _
ByVal lpFileTime As FILETIME, _
ByVal lpLocalFileTime As FILETIME) As Long

Public Declare Function FileTimeToSystemTime Lib "kernel32" ( _
ByVal lpFileTime As FILETIME, _
ByVal lpSystemTime As SYSTEMTIME) As Long


Function testdate1()

Dim fData As WIN32_FIND_DATA
Dim St As SYSTEMTIME
Dim Ft1 As FILETIME
Dim Ft2 As FILETIME

' ****** incomplet ********
' Connexion sur le serveur FTP ...
internet_ok = InternetOpen("PutFtpFile", 1, "", "", 0)
ftp_ok = InternetConnect(internet_ok, serveur_ftp, 21, login,
mot_passe, 1, &H8000000, 0)
select_rep = FtpSetCurrentDirectory(ftp_ok, rep)
FtpFindFirstFile(ftp_ok, "*.*", fData, 0, 0)

' ******

Ft1 = fData.ftLastWriteTime

' Conversion File Time en Local File Time

retour1 = FileTimeToLocalFileTime(Ft1, Ft2)

End Function



End Module



Lorsque je fais tourner ce code, je récupère bien dans la structure fData
les paramètres qui m'interessent :

fData.cFileName : Contient le nom du fichier concerné,
fData.nFileSizeLow : Contient la taille du fichier.
fData.ftCreationTime et fData.ftLastAccessTime = 0 (ce qui d'après ce que
j'ai lu sur Internet semble
cohérent).

En revanche, fData.fLastWriteTime n'est pas vide.
La structure FILETIME associée à fLastWriteTime contient les valeurs :

dwHighDateTime : 29731569
dwLowDateTime : -1208734720

Ceci m'amène à vous poser une première question : Est-ce que les valeurs
ci-dessus vous
semblent correctes ?

Lorsque j'exécute le code de la fonction testdate1(), j'obtient lors de
l'exécution
de FileTimeToLocalFileTime(Ft1, Ft2) le message d'erreur suivant :

"Une exception non gérée du type 'System.NullReferenceException' s'est
produite dans
toto.exe.
La référence d'objet n'est pas définie à une instance d'un objet".


Voila.

Merci d'avance pour toute aide que vous pourrez m'apporter.


Jean-Marc