【问题标题】:create a directory with subdirectories in a single ftp request?在单个 ftp 请求中创建带有子目录的目录?
【发布时间】:2012-12-31 09:19:13
【问题描述】:

我遇到了一个关于如何在单个 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);

但它不起作用。

有没有一种简单的方法可以让我在一个请求中创建一个包含其他子目录的文件夹?

【问题讨论】:

  • 您是否考虑使用免费的开源 ftp 库代替原生框架 FtpWebRequest 类?
  • 为什么不使用免费的 FTP 库:stackoverflow.com/questions/1371964/free-ftp-library。可能会容易得多,而且我相信他们中的一个人会在一次通话中开箱即用地处理这种情况。

标签: c# .net ftp ftpwebrequest


【解决方案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 框架。 (客户资料还不够)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      相关资源
      最近更新 更多