Как изменить каталоги с помощью FtpWebRequest (.NET)?


Может кто-нибудь сказать мне, как изменить каталоги с помощью FtpWebRequest? Кажется, это должно быть легко сделать, но я этого не вижу.

EDIT

Я просто хочу добавить...У меня нет сердца, настроенного на FtpWebRequest. Если есть лучший (более простой) способ сделать FTP в .NET, пожалуйста, дайте мне знать.


По-видимому, нет способа сделать это с помощью живого соединения, вам нужно изменить uri, чтобы обмануть ftpwebrequest в использовании другого запроса (спасибо Джон).

Итак, я ищу стороннего клиента...

Некоторые из решений с открытым исходным кодом, которые я пробовал, не слишком хорошо работали (постоянно сбоили), но я нашел одно решение с открытым исходным кодом, которое прошло некоторые из моих предварительных тестов (.NET FTP Client).

3 8

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);

Вместо использования метода ListDirectory метода FTPWebRequest можно использовать метод ListDirectoryDetails метода FtpWebRequest .

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