Как изменить каталоги с помощью FtpWebRequest (.NET)?
Может кто-нибудь сказать мне, как изменить каталоги с помощью FtpWebRequest? Кажется, это должно быть легко сделать, но я этого не вижу.
EDIT
Я просто хочу добавить...У меня нет сердца, настроенного на FtpWebRequest. Если есть лучший (более простой) способ сделать FTP в .NET, пожалуйста, дайте мне знать.
По-видимому, нет способа сделать это с помощью живого соединения, вам нужно изменить uri, чтобы обмануть ftpwebrequest в использовании другого запроса (спасибо Джон).
Итак, я ищу стороннего клиента...
Некоторые из решений с открытым исходным кодом, которые я пробовал, не слишком хорошо работали (постоянно сбоили), но я нашел одно решение с открытым исходным кодом, которое прошло некоторые из моих предварительных тестов (.NET FTP Client).
3 ответа:
Есть сообщение в блоге от Марии Атанасовой, которое показывает, как вы можете подделать его - в основном вы должны поместить каталог на URL.
Я подозреваю, что вам может быть лучше с выделенной FTP - библиотекой, которая не пытается заставить все в WebRequest способ делать вещи. Я лично не использовать любой 3-й партии библиотеки для этого, но поиск по "FTP-сервер библиотеки .Сеть" находит много кандидатов.
Edit: jcolebrand (в случае блога 2006 года возможность linkrot)
Многие клиенты спрашивают нас, как они могут использовать команду CWD с нашим FtpWebRequest.Ответ таков: вы не можете использовать команду напрямую, но вы можете изменить параметр uri для достижения того же результата.
Допустим, вы используете следующий формат:
String uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl"; FtpWebRequest Request = (FtpWebRequest)WebRequest.Create(uri); Request.Method = "LIST";
Приведенный выше пример приведет вас к каталогу вашего пользователя и перечислит все содержимое там. Теперь предположим, что вы хотите перейти на 2 каталога назад и перечислите содержимое (при условии, что у вашего пользователя есть разрешения на это). Вы закрываете предыдущий FtpWebRequest и выпускаете новый с этим uri
uri = "ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/%2E%2E/%2E%2E";
Это эквивалентно входу в систему с учетными данными пользователя, а затем с помощью
cd ../../
Примечание: Если вы попытаетесь использовать
”..”
напрямую, не экранируя их, класс uri их лишит, поэтому"ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/../.."
эквивалентно"ftp://myFtpUserName:myFtpUserPassword@myFtpUrl/"
Теперь предположим, что вы хотите перейти в каталог другого пользователя, который является одним уровень выше корня. Если вы не укажете имя пользователя и пароль, это будет равносильно входу в систему как анонимный пользователь. Затем вы выдаете новый
FtpWebRequest
со следующим uri"ftp://myFtpUrl/%2F/anotherUserDir"
Это эквивалентно входу в систему как анонимный, а затем выполнению
Cd / cd anotherUserDirectory
Вы должны закрыть текущее соединение:
request.Close();
И открыть новый с другим uri:
uri = "ftp://example.com/%2F/directory" //Go to a forward directory (cd directory) uri = "ftp://example.com/%2E%2E" //Go to the previously directory (cd ../) FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);