在单个FTP请求中创建一个带有子目录的目录?

4

我有一个小问题,如何在单个FTP请求中创建带有子目录的目录

我有一个字符串s

    string s = "a/b/c/d"

注意:斜杠之间的单词是随机的,数量不确定。

如何在FTP服务器上创建目录a/b/c/d?

我使用的方法是将字符串分割并使用以下代码为每个部分创建文件夹:

    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://domain.com/public_html/a");
    ftpWebRequest.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    ftpWebRequest.Method = WebRequestMethods.Ftp.MakeDirectory;
    ftpWebRequest.GetResponse();

然后我在a目录下创建了b目录,在b目录下创建了c目录,再在c目录下重复一些代码来创建d目录。

我尝试直接输入网址,例如:

    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://doemin.com/public_html/a/b/c/d);

但是它不起作用。

是否有一种简单的方法可以在一个请求中创建一个带有其他子目录的文件夹?


1
您是否考虑使用免费开源的FTP库,而不是本地框架FtpWebRequest类? - Steve
为什么不使用免费的FTP库:https://dev59.com/NnM_5IYBdhLWcg3wdy1g。这样可能会更容易,我相信其中一个库可以通过单个调用处理此情况。 - mellamokb
2个回答

1

如果您愿意使用更友好的库(免费且开源),例如这个:

System.Net.FtpClient.dll

那么你可以编写类似于这样的代码(改编自他们的示例)

static ManualResetEvent m_reset = new ManualResetEvent(false);
void Main()
{
    m_reset.Reset();
    using (FtpClient ftp = new FtpClient())
    {
        ftp.Host = "yourFTPHost.com";
        ftp.Credentials = new NetworkCredential("yourUserName", "yourPassword");
        ftp.SetWorkingDirectory("/rootForTest");
        if(ftp.DirectoryExists("test"))
            ftp.DeleteDirectory("test", true);
        ftp.BeginCreateDirectory("test/path/that/should/be/created", true,
                    new AsyncCallback(CreateDirectoryCallback), ftp);
        m_reset.WaitOne();
        ftp.Disconnect();
    }
}
static void CreateDirectoryCallback(IAsyncResult ar) 
{
    FtpClient ftp = ar.AsyncState as FtpClient;
    try 
    {
        if (ftp == null)
             throw new InvalidOperationException("The FtpControlConnection object is null!");
        ftp.EndCreateDirectory(ar);
    }
    catch (Exception ex) 
    {
        Console.WriteLine(ex.ToString());
    }
    finally 
    {
        m_reset.Set();
    }
}

一件小事:System.Net.FtpClient需要完整的.NET 4.0框架。(客户端配置文件是不够的)

1
一些服务器支持FTP命令,例如MKD a/b/c/d。如果您的服务器不支持此命令,但支持通过SITE命令执行shell命令,则可以尝试调用“SITE md a/b/c/d”(但这是机器特定的)。如果以上方法都不起作用,则必须像以前一样循环创建文件夹或使用某个库将此循环隐藏在一个方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接