2016-05-07 3 views
0

Цель:FtpWebRequest: Создание вложенных каталогов (локальных против дистанционного управления)

Я хочу, чтобы убедиться, что FTP путь существует перед загрузкой файлов, если не ==> создать его.

код я использую:

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

Где CreateFTPDir является:

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 

Теперь, когда я проверить этот код на моем локальном сервере FTP (созданного с помощью FileZilla), он создает путь, независимо от количества вложенных каталогов. , но, когда я использую его на самом удаленном FTP-сервере, он выдает следующее исключение: The remote server returned an error: (550) File unavailable, если каталог ectories для создания более одного.

Мой вопрос Почему эта проблема не возникает с локальным сервером? и мне нужно создать каждый вложенный каталог отдельно на удаленном сервере?


Дополнительная информация + второй вопрос:

Это FTPDirExists функция Я использую (лучшее, что я мог придумать после долгих поисков):

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 

Это не на 100% точно, как я упомянул в комментарии выше, поэтому, пожалуйста, дайте мне знать, если у вас есть более точный метод.

ответ

0

Я решил использовать другую функцию, которая создает каждую папку пути отдельно:

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