Oprettet tor. d. 11. august 2011 kl. 14:39:47

angelenglen
angelenglen (7.306 point. Point ude: 200)

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

Skrevet tor. d. 11. august 2011 kl. 15:02:26| #1

angelenglen
angelenglen (7.306 point)
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

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

visual basic 2010

Oprettet den 22. maj 2012 kl. 12.29
omer1345 giver 30 point for svar | Giv et svar »

GridView med fast linkbillede, der fører til et...

Oprettet den 21. maj 2012 kl. 15.27
neesgaard giver 100 point for svar | Giv et svar »

VCard på ASP.NET overført til Outlook´s kontaktpersoner

Oprettet den 20. maj 2012 kl. 18.45
per2edb giver 200 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger