2016-05-07 15 views
0

Ziel:FtpWebRequest: verschachtelten Verzeichnissen (lokale vs remote) create

Ich möchte sicherstellen, dass FTP-Pfad-Dateien vor dem Hochladen existiert, wenn nicht ==> es schaffen.

-Code Ich verwende:

Dim ftpPath As String = "ftp://----------/ParentDir/SubFolder1/SubFolder2" 
If Not FTPDirExists(ftpPath) Then 
    CreateFTPDir(ftpPath) 
End If 

Wo CreateFTPDir ist:

Private Sub CreateFTPDir(DirPath As String) 
    Dim request As FtpWebRequest = FtpWebRequest.Create(DirPath) 
    request.Credentials = New NetworkCredential("UserName", "Password") 
    request.Method = WebRequestMethods.Ftp.MakeDirectory 
    request.Proxy = Nothing 
    request.KeepAlive = True 
    Try 
     Dim resp As FtpWebResponse = request.GetResponse() 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 
End Sub 

Nun, wenn ich diesen Code auf meinem lokalen FTP-Server zu testen (mit FileZilla erstellt), schafft der Pfad egal die Anzahl der verschachtelten Verzeichnisse .. aber Wenn ich es auf dem tatsächlichen (remote) FTP-Server verwenden, löst es die folgende Ausnahme aus: The remote server returned an error: (550) File unavailable, wenn die Richt Die zu erstellenden Objekte sind mehr als eins.

Meine Frage ist, warum tritt dieses Problem nicht mit dem lokalen Server auf? und muss ich jedes verschachtelte Verzeichnis separat auf dem Remote-Server erstellen?


Zusatzinfo + 2. Frage:

Dies ist die FTPDirExists Funktion Ich verwende (das beste, das ich mit nach viel Suche einfiel):

Private Function FTPDirExists(DirPath As String) As Boolean 
    DirPath &= If(DirPath.EndsWith("/"), "", "/") 
    Dim request As FtpWebRequest = FtpWebRequest.Create(DirPath) 
    request.Credentials = New NetworkCredential("UserName", "Password") 
    request.Method = WebRequestMethods.Ftp.ListDirectoryDetails 
    request.Proxy = Nothing 
    request.KeepAlive = True 
    Try 
     Using resp As FtpWebResponse = request.GetResponse() 
      Return True 
     End Using 
    Catch ex As WebException 
     Dim resp As FtpWebResponse = DirectCast(ex.Response, FtpWebResponse) 
     If resp.StatusCode = FtpStatusCode.ActionNotTakenFileUnavailable Then 
      Return False ' ==> Unfortunately will return false for other reasons (like no permission). 
     Else 
      Return False ' ==> Don't bother about this. 
     End If 
    End Try 
End Function 

Es ist nicht 100% korrekt, wie ich oben im Kommentar erwähnt habe. Bitte lassen Sie mich wissen, wenn Sie eine genauere Methode haben.

Antwort

0

Ich habe beschlossen, eine andere Funktion zu verwenden, die jeden Ordner des Pfades separat erstellt:

Public Shared Sub CreatePath(RootPath As String, PathToCreate As String, Cred As NetworkCredential) 
    Dim request As FtpWebRequest 
    Dim subDirs As String() = PathToCreate.Split("/"c) 
    Dim currentDir As String = If(RootPath.EndsWith("/"), RootPath.Substring(0, RootPath.Length - 1), RootPath) 
    For Each subDir As String In subDirs 
     currentDir &= "/" & subDir 

     request = DirectCast(FtpWebRequest.Create(currentDir), FtpWebRequest) 
     request.Credentials = Cred 
     request.Method = WebRequestMethods.Ftp.MakeDirectory 
     request.Proxy = Nothing 
     Try 
      Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse) 
      response.Close() 
     Catch ex As Exception 

     End Try 
    Next 
End Sub