Ftp.MakeDirectory вложенная структура - PullRequest
1 голос
/ 02 февраля 2012

Что вы, ребята, делаете, если у вас нет прав для создания подкаталогов на ftp? Видимо, вы не можете создать каталог в одной команде

Итак, это:

path = "ftp://someftp.com/files/newFolder/innerFolder";
var request = (FtpWebRequest)WebRequest.Create(path);
request.Method = WebRequestMethods.Ftp.MakeDirectory;
var response = (FtpWebResponse)request.GetResponse());

выдаст исключение с кодом ошибки 550, если 'files' или 'newFolder' уже существует

  1. Как проверить, есть ли у меня права на создание подкаталогов?

  2. Что я могу сделать, если у меня нет этих прав? Покажите мне пожалуйста код, который позволяет вам создавать структуру папок в более чем одной команде.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Хорошо: потому что FtpWebRequest не имеет состояния - нет способа изменить текущий каталог на FTP. К счастью, мы можем использовать одну из библиотек FTP с открытым исходным кодом. Вот пример с библиотекой FTPS AlexPilotti, которая доступна через NuGet

using (var client = new FTPSClient())
{
     var address = Regex.Match(path, @"^(ftp://)?(\w*|.?)*/").Value.Replace("ftp://", "").Replace("/", "");
     var dirs = Regex.Split(path.Replace(address, "").Replace("ftp://", ""), "/").Where(x => x.Length > 0);
     client.Connect(address, credential, ESSLSupportMode.ClearText);
     foreach (var dir in dirs)
     {
        try
           {
              client.MakeDir(dir);
           }
        catch (FTPException)
        {
        }
        client.SetCurrentDirectory(dir);
     }

   }
}
1 голос
/ 02 февраля 2012

Вы правы. Вы не можете создать полный путь в одной команде к FTP. Самый простой способ сделать это, вероятно, следующим образом:

  1. Создайте метод make directory, который принимает Uri.
  2. Убедитесь, что вы можете различать ошибки, при которых часть пути не существует, и другие ошибки.
  3. Если это не путевая ошибка, сбросить исключение.
  4. Если это ошибка пути:
  5. Обрезать последний каталог по пути.
  6. Если больше нечего обрезать, выйдите, выдав соответствующее новое исключение.
  7. Попробуйте создать новый путь.
  8. Затем попробуйте снова создать окончательный каталог.

Таким образом, по сути, он становится рекурсивным с двумя предельными условиями, исключениями, не связанными с путями, и ничего не остается для обрезки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...