Erreur dans fonction FileTimeToLocalFileTime

Résolu
timotep Messages postés 34 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 16 janvier 2008 - 21 nov. 2007 à 17:51
cavo789 Messages postés 168 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 28 juillet 2009 - 29 janv. 2008 à 10:57
Bonjour, j'ai le problème suivant, sur un de mes programmes, et pour
lequel je n'ai trouvé aucune solution, n'ayant pas trouvé pourquoi ça
coince :


Le programme me permet d'aller chercher sur un serveur Ftp une liste de
fichiers, et de récupérer les noms (ça c'est ok), mais ausside
récupérer la dernière date de modification (là, ça se corse, et c'est
là que mon programme plante) :


Voici quelques lignes de mon code :


Public Sub ListerFichiers(ByRef RepServeur As String)


Dim pData As WIN32_FIND_DATA

Dim essai As String

Dim i As Integer = 0

Dim lRet As Integer

Dim hFind As Integer


pData.cFileName = New String(Chr(0), 260)

hFind = FtpFindFirstFile(LhConnection, RepServeur, pData, 0, 0)

If hFind = 0 Then Exit Sub

Do
   pData.cFileName = New String(Chr(0), 260)
   lRet = InternetFindNextFile(hFind, pData)
   If lRet = 0 Then Exit Do
  
If not (pData.dwFileAttributes And FileAttribute.Directory) = FileAttribute.Directory   Then
     'stockage des noms des fichiers dans un tableau :
    
listeFichiersWeb(i, 0) = Left(pData.cFileName, InStr(pData.cFileName, Chr(0)) - 1)
    
'Là, c'est la ligne qui va permettre de convertir la date
    
' c'est ma fonction "FileTimeToDate" qui pose problème (voir ci-dessous la fonction)
    
essai = FileTimeToDate(pData.ftLastWriteTime)
    
'Pour le débugage, je me suis contenté d'afficher le résultat, mais mon prog bloque     avant de toute façon :
     MsgBox(essai)

End If

i += 1

Loop

InternetCloseHandle(hFind)


End Sub


'La fonction qui déconne :

Private Function FileTimeToDate(ByVal ft As FILETIME) As Date


Dim datelocale As FILETIME, datesys As SYSTEMTIME


' LA LIGNE QUI COINCE DANS MON PROGRAMME :

If FileTimeToLocalFileTime(ft, datelocale) = 0 Then Exit Function

If FileTimeToSystemTime(datelocale, datesys) = 0 Then Exit Function

FileTimeToDate = CDate(datesys.wDay & " " & datesys.wMonth & " " & datesys.wYear & " " & _

datesys.wHour & ":" & datesys.wMinute & ":" & datesys.wSecond)


End Function

J'ai le message d'erreur suivant :
erreur Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.


Or, je ne sais pas quoi faire pour résoudre cette erreur.

3 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
21 nov. 2007 à 22:02
Bonsoir,
Cela vient certainement de ta signature de la fonction FileTimeToLocalFileTime.
Comment l'as-tu écrite ?

Si tu regardes sur MSDN elle attend 2 structures FILETIME, donc en VB.Net je passe mes structures par référence ByRef et non par valeur ByVal comme ceci:
Public Declare Function FileTimeToLocalFileTime Lib "kernel32.dll" (ByRef lpFileTime as FILETIME, ByRef lpLocalFileTime as FILETIME) as Boolean

Profite pour vérifier la signature de FileTimeToSystemTime et la déclaration de la structure FILETIME également

++
3
timotep Messages postés 34 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 16 janvier 2008
22 nov. 2007 à 11:14
Rebonjour,

Merci à toi, tu as bien vu, c'était exactement mon problème :

1) changer les paramètres en les assant par ref et non par valeur :




    Public Declare Function FileTimeToLocalFileTime Lib "kernel32" (ByRef lpFileTime As FILETIME, ByRef lpLocalFileTime As FILETIME) As Long
    Public Declare Function FileTimeToSystemTime Lib "kernel32" (ByRef lpFileTime As FILETIME, ByRef lpSystemTime As SYSTEMTIME) As Long

2) Changer le type de mes variables dans ma structure FILETIME :

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

Ainsi, avec le code que j'ai mis au-dessus, ça fonctionne. Merci beaucoup, tu m'as enlevé une bonne épine du pied, je n'aurais pas pensé à cette erreur sans cela, d'autant que de très nombreux codes sont en exemple, mais en VB6 la plupart du temps. je vais retourner à mon prog sereinement
3
cavo789 Messages postés 168 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 28 juillet 2009 1
29 janv. 2008 à 10:57
Bonjour

Depuis hier, je cherche sur Internet un code qui me permettrait de récupérer la date des fichiers qui se trouvent sur mon serveur FTP.    Après plusieurs heures de recherches, essais, ... toujours rien.

J'ai pû constituer le code ci-dessous et il semble bien que je retrouve le fichier.  En effet, la valeur de hFind (que j'ai mis en gras / bleu) est différente de zéro.    Je présume que le fichier est donc bien retrouvé.   Toutefois, wfd ne me retourne que des valeurs vides (pour les strings) et des zéros (pour les long).   Argggh.

Pourriez-vous m'aider ?

Mon souhait : récupérer la date de création des fichiers sur mon FTP de telle manière que je puisse faire un FTPGet et ensuite, réinitialiser la date des fichiers en local.

MERCI....

' Microsoft SQL Server Integration Services Script Task
' Write scripts using Microsoft Visual Basic
' The ScriptMain class is the entry point of the Script Task.
Option Strict Off
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
' Must have System.Net to use FtpWebRequest
Imports System.Net
' Must have System.IO to use StreamReader
Imports System.IO

Public Structure FILETIME
    Dim dwLowDateTime As Long
    Dim dwHighDateTime As Long
End Structure

Public Structure SYSTEMTIME
    Dim wYear As Short
    Dim wMonth As Short
    Dim wDayOfWeek As Short
    Dim wDay As Short
    Dim wHour As Short
    Dim wMinute As Short
    Dim wSecond As Short
    Dim wMilliseconds As Short
End Structure
Public Structure WIN32_FIND_DATA
    Dim dwFileAttributes As Long
    Dim ftCreationTime As FILETIME
    Dim ftLastAccessTime As FILETIME
    Dim ftLastWriteTime As FILETIME
    Dim nFileSizeHigh As Long
    Dim nFileSizeLow As Long
    Dim dwReserved0 As Long
    Dim dwReserved1 As Long
    <VBFixedString(260)> Public cFileName As String
    <VBFixedString(14)> Public cAlternate As String
End Structure

Public Class ScriptMain

    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal HINet As Integer) As Integer

    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Integer, _
                                   ByVal sProxyName As String, ByVal sProxyBypass As String, _
                                   ByVal lFlags As Integer) As Integer

    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Integer, _
                                   ByVal sServerName As String, _
                                   ByVal nServerPort As Integer, _
                                   ByVal sUsername As String, _
                                   ByVal sPassword As String, _
                                   ByVal lService As Integer, _
                                   ByVal lFlags As Integer, _
                                   ByVal lContext As Integer) As Integer

    Private Declare Auto Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" _
   (ByRef hFtpSession As Long, ByRef lpszSearchFile As String, _
    ByRef lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long

    Public Declare Function FileTimeToLocalFileTime Lib "kernel32" (ByRef lpFileTime As FILETIME, ByRef lpLocalFileTime As FILETIME) As Long
    Public Declare Function FileTimeToSystemTime Lib "kernel32" (ByRef lpFileTime As FILETIME, ByRef lpSystemTime As SYSTEMTIME) As Long

    ' The execution engine calls this method when the task executes.
    ' To access the object model, use the Dts object. Connections, variables, events,
    ' and logging features are available as static members of the Dts class.
    ' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.
    ' 
    ' To open Code and Text Editor Help, press F1.
    ' To open Object Browser, press Ctrl+Alt+J.

    Public Sub Main()

        Dim host As String =  Dts.Variables("sFTPServerName").Value.ToString
        Dim username As String = Dts.Variables("sFTPLogin").Value.ToString
        Dim password As String = Dts.Variables("sFTPPassword").Value.ToString
        Dim sFTPRootFolder As String = Dts.Variables("sFTPRootFolder").Value.ToString

        Dim dwHighDateTime As Long
        Dim dwLowDateTime As Long
        Dim hFind As Long
        Dim nFlag As Long
        Dim ft As FILETIME

        Dim wfd As WIN32_FIND_DATA

        dwHighDateTime = 29777492
        dwLowDateTime = 1503098368

        Dim INet, INetConn As Integer
        Dim RC As Boolean
        INet = InternetOpen("HR_Reporting_SAPFULLDATA", 1, vbNullString, vbNullString, 0)
        INetConn = InternetConnect(INet, host, 0, username, password, 1, nFlag, 0)

        hFind = FtpFindFirstFile(INetConn, sFTPRootFolder &amp; "ZPC2.txt", wfd, 0, 0)

        InternetCloseHandle(INetConn)

        MsgBox("hFind " &amp; hFind) 
        MsgBox("cFileName : " &amp; wfd.cFileName)
        MsgBox("cAlternate : " &amp; wfd.cAlternate)

        InternetCloseHandle(INet)

        Dts.TaskResult  = Dts.Results.Success

    End Sub

End Class



Christophe
0
Rejoignez-nous