Как изменить каталоги с помощью FtpWebRequest (.NET) - PullRequest
8 голосов
/ 01 декабря 2008

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

EDIT

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


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

Так что я ищу стороннего клиента ...

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

Ответы [ 3 ]

13 голосов
/ 01 декабря 2008

Есть сообщение в блоге от Марии Атанасовой, которое показывает, как вы можете подделать его - в основном вы должны поместить каталог в URL.

Я подозреваю, что вам, возможно, будет лучше с выделенной библиотекой FTP, которая не пытается навязать все в WebRequest. Я лично не использовал сторонние библиотеки для этого, но поиск «FTP library .NET» находит много кандидатов.


Редактировать: jcolebrand (в случае возможности linkrot в блоге 2006 года)

Многие клиенты спрашивают нас, как они могут использовать команду 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
3 голосов
/ 27 июня 2016

Вы должны закрыть текущее соединение:

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);
2 голосов
/ 23 февраля 2011

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

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

...