首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FtpWebRequest:创建嵌套目录(本地目录和远程目录)

FtpWebRequest:创建嵌套目录(本地目录和远程目录)
EN

Stack Overflow用户
提问于 2016-05-07 12:23:49
回答 1查看 168关注 0票数 0

目标:

我希望在上传文件之前确保FTP路径的存在,如果不是==>创建的话。

我正在使用的代码:

代码语言:javascript
复制
Dim ftpPath As String = "ftp://----------/ParentDir/SubFolder1/SubFolder2"
If Not FTPDirExists(ftpPath) Then
    CreateFTPDir(ftpPath)
End If

其中CreateFTPDir是:

代码语言:javascript
复制
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

我的问题是为什么本地服务器没有出现这个问题?我是否必须在远程服务器上分别创建每个嵌套目录?

附加信息+第二个问题:

这是我正在使用的FTPDirExists函数(经过大量搜索后我能想到的最好的):

代码语言:javascript
复制
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%的准确性,正如我在上面的评论,所以请告诉我,如果你有一个更准确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-02 13:41:07

我决定使用另一个函数分别创建路径的每个文件夹:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37088496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档