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 server, он выдает следующее исключение: The remote server returned an error: (550) File unavailable если каталогов для создания больше одного.

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


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

Это функция 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% точно, как я упоминал в комментарии выше, поэтому, пожалуйста, дайте мне знать, если у вас есть более точный метод.


person 41686d6564    schedule 07.05.2016    source источник


Ответы (1)


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

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
person 41686d6564    schedule 02.06.2016