Avatar billede angelenglen Nybegynder
11. august 2011 - 14:39 Der er 1 løsning

Haster :-( Problem med rekursiv FTP funktion

Jeg har et problem med en funktion, der via FTP skal downloade en mappes indhold, incl undermapper og filer deri, rekursivt.


Den virker fint, indtil jeg forsøger at køre den rekursivt.
Dvs. jeg får fint hentet filer i rod-mappen, og jeg får oprettet mapperne fra rod-mapperne.
Men når jeg så funktionen (for hver mappe) forsøger at kalde sig selv, får jeg en "Object reference not set to an instance of an object"-fejl ved følgende linie:

        If Len(strUsername) > 1 And Len(strPassword) > 1 Then ftpclientRequest.Credentials = New NetworkCredential(strUsername, strPassword)

Fejlen referer til at ftpclientRequest er Nothing, men jeg forstår ikke HVORFOR den er nothing.
Den er jo ikke nothing når jeg kører funktionen første gang, det er kun når funktionen kalder sig selv i følgende linie:

Dim boolSyncFTP = SyncLocalFolderFromFTP(strLocalFilePath, strUsername, strPassword, strLocalFilePath)


Jeg kan simpelthen ikke gennemskue hvorfor funktionen fejler når den kalder sig selv...



Her er koden til min funktion:

  Private Shared Function SyncLocalFolderFromFTP(ByVal strUri As String, ByVal strUsername As String, ByVal strPassword As String, ByVal LocalPath As String)
        Dim ftpclientRequest As FtpWebRequest = TryCast(WebRequest.Create(strUri), FtpWebRequest)
        If Len(strUsername) > 1 And Len(strPassword) > 1 Then ftpclientRequest.Credentials = New NetworkCredential(strUsername, strPassword)
        ftpclientRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
        ftpclientRequest.Proxy = Nothing
        Dim response As FtpWebResponse = TryCast(ftpclientRequest.GetResponse(), FtpWebResponse)
        Dim sr As New StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII)
        Dim Datastring As String = sr.ReadToEnd()
        response.Close()

        Dim list As FileStruct() = (New FTPfeatures()).GetList(Datastring)
        Dim strRemoteFilePath, strRemoteTimestamp, strLocalFilePath As String
        For Each thisstruct As FileStruct In list
            If thisstruct.IsDirectory Then
                strRemoteTimestamp = thisstruct.CreateTime
                strRemoteFilePath = strUri & "/" & thisstruct.Name
                strLocalFilePath = LocalPath & "\" & thisstruct.Name
                If CreateLocalFolder(strLocalFilePath, strRemoteTimestamp) = True Then
                    'Kopier mapper rekursivt: nu er mappen oprettet, kald så SyncLocalFolderFromFTP igen, for at kopiere filer og undermapper i den nye mappe.
                    Dim boolSyncFTP as Boolean = SyncLocalFolderFromFTP(strLocalFilePath, strUsername, strPassword, strLocalFilePath)
                End If
            Else
                strRemoteTimestamp = thisstruct.CreateTime
                strRemoteFilePath = strUri & "/" & thisstruct.Name
                strLocalFilePath = LocalPath & "\" & thisstruct.Name
                Dim tmp As Boolean = DownloadFTPfile(strRemoteFilePath, strRemoteTimestamp, strLocalFilePath)
            End If
        Next
        Return True
    End Function






Ps. Jeg kalder nogle andre custom funktioner som fx CreateLocalFolder og DownloadFTPfile, disse virker fint enkeltvist, og bliver kørt uden problemer, men hvis det ønskes kan jeg også vise kildekoden til dem, tror dog ikke de er relevante.

PPs: her er mine imports, hvis det hjælper noget...
Imports System.IO
Imports System.Net
Imports System.Collections
Imports System.Collections.Generic
Imports System.Text.RegularExpressions
Avatar billede angelenglen Nybegynder
11. august 2011 - 15:02 #1
Argh det var dog den dummeste fejl jeg længe har lavet!

Dim boolSyncFTP = SyncLocalFolderFromFTP(strLocalFilePath, strUsername, strPassword, strLocalFilePath)

skulle have været:

Dim boolSyncFTP = SyncLocalFolderFromFTP(strRemoteFilePath, strUsername, strPassword, strLocalFilePath)

Dvs således:

    Private Shared Function SyncLocalFolderFromFTP(ByVal strUri As String, ByVal strUsername As String, ByVal strPassword As String, ByVal LocalPath As String)
        Dim ftpclientRequest As FtpWebRequest = TryCast(WebRequest.Create(strUri), FtpWebRequest)
        If Len(strUsername) > 1 And Len(strPassword) > 1 Then ftpclientRequest.Credentials = New NetworkCredential(strUsername, strPassword)
        ftpclientRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails
        ftpclientRequest.Proxy = Nothing
        Dim response As FtpWebResponse = TryCast(ftpclientRequest.GetResponse(), FtpWebResponse)
        Dim sr As New StreamReader(response.GetResponseStream(), System.Text.Encoding.ASCII)
        Dim Datastring As String = sr.ReadToEnd()
        response.Close()

        Dim list As FileStruct() = (New FTPfeatures()).GetList(Datastring)
        Dim strRemoteFilePath, strRemoteTimestamp, strLocalFilePath As String
        For Each thisstruct As FileStruct In list
            If thisstruct.IsDirectory Then
                strRemoteTimestamp = thisstruct.CreateTime
                strRemoteFilePath = strUri & "/" & thisstruct.Name
                strLocalFilePath = LocalPath & "\" & thisstruct.Name
                If CreateLocalFolder(strLocalFilePath, strRemoteTimestamp) = True Then
                    'Kopier mapper rekursivt: nu er mappen oprettet, kald så SyncLocalFolderFromFTP igen, for at kopiere filer og undermapper i den nye mappe.
                    Dim boolSyncFTP As Boolean = SyncLocalFolderFromFTP(strRemoteFilePath, strUsername, strPassword, strLocalFilePath)
                End If
            Else
                strRemoteTimestamp = thisstruct.CreateTime
                strRemoteFilePath = strUri & "/" & thisstruct.Name
                strLocalFilePath = LocalPath & "\" & thisstruct.Name
                Dim tmp As Boolean = DownloadFTPfile(strRemoteFilePath, strRemoteTimestamp, strLocalFilePath)
            End If
        Next
        Return True
    End Function
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester