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