Проблема с переименованием файла на FTP-сервере только в .NET Framework 4.0! - PullRequest
4 голосов
/ 12 ноября 2010

У меня проблема с переименованием файла FTP с использованием следующего кода:

    Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/myfile.txt")), FtpWebRequest)
    'Set that we will be renaming a file
    Request.Method = WebRequestMethods.Ftp.Rename
    'Provide the new filename
    Request.RenameTo = NewFileName
    'The credentials needed to log onto the server
    Request.Credentials = New NetworkCredential("username", "password")
    'We are going to enable SSL for the communication with the FTP server as required by the remote server.
    Request.EnableSsl = True
    Request.UsePassive = True
    Request.KeepAlive = False
    'Create a Response object getting the downloaded file
    Dim Response As FtpWebResponse = DirectCast(Request.GetResponse(), FtpWebResponse)
    Response.Close()

У меня никогда не было, чтобы он работал, или мне нужно было переименовать файл FTP до .NET 4.0, так что это был первый код, который я написал,Близкая производная этого кода для загрузки файла РАБОТАЕТ, поэтому он не является проблемой SSL или FTP (читайте дальше для подробного отслеживания) Очевидно, что этот код был задокументирован для работы в Framework 3.5 или более ранней версии.В проекте VS.NET 2010 .NET Framework 4.0 я всегда получаю ответ: «Удаленный сервер возвратил ошибку: (550) файл недоступен (например, файл не найден, нет доступа).»

Угадайте, что ..скопировал точный код в старый тестовый проект VS.NET 2008, запустил его снова -> отлично работал!

Так что я подумал, что просто оберну этот код в двоичный файл, ориентированный на 3.5 Framework, и затем буду ссылаться на него вмой проект VS.NET 2010, чтобы перехитрить ошибку, но она не работала.

Я попытался добавить обходной путь, который я нашел, заявляя, что добавление префикса "% 2E /" к имени файла не работает для меня.Мой журнал трассировки продолжал выводить те же результаты:

Информация о System.Net: 0: [2228] FtpControlStream # 15409429 - Получен ответ [257 "/ users / company" является текущим каталогом]
Информация о System.Net: 0: [2228] FtpControlStream # 15409429 - Команда отправки [RNFR /myfile.txt]
Информация о System.Net: 0: [2228] FtpControlStream # 15409429 - Получен ответ [Файл 550 / myfile.txt not found]

VS.NET 2008 имеет разные результаты, пропуская первую косую черту перед файлом переименования:

Информация о System.Net: 0: [6460] FtpControlStream # 40715158 - Полученоответ [257 "/ users / company" является текущим каталогом]
Информация System.Net: 0: [6460] FtpControlStream # 40715158 - Отправка команды [CWD / users / company /]
Информация System.Net: 0:[6460] FtpControlStream # 40715158 - Полученный ответ [250 Команда CWD выполнена успешно]
Информация System.Net: 0: [6460] FtpControlStream # 40715158 - Отправка команды [RNFR myfile.txt]
SysИнформация tem.Net: 0: [6460] FtpControlStream # 40715158 - Полученный ответ [350 Введите новое имя]
Информация System.Net: 0: [6460] FtpControlStream # 40715158 - Отправка команды [RNTO myfileOLD.txt]
Информация System.Net: 0: [6460] FtpControlStream # 40715158 - Полученный ответ [250 переименован]

Я перепробовал каждую комбинацию и не могу заставить ее работать, кроме как при работе в VS.NET 2008или до.Это похоже на ошибку или недокументированное изменение процедуры, что, вероятно, требует записи на connect.microsoft.com.

Любая помощь или предложения по этому поводу?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 20 декабря 2011

Я видел эту цитату на форуме

Если URI имеет вид "ftp://contoso.com/%2fpath" (% 2f - экранированный '/'), тогда URI является абсолютным, а текущий каталог - /path.'

У меня было что-то вроде этого:

Dim _request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://xxx.xxx.xxx.xx/%2fremotedirectory/filename.txt")), FtpWebRequest)

Я хотел переместить файл в remotedirectory/archive/filename.txt

поэтому, как только я сделал запрос ftp, я оказался в каталоге remotedirectory, поэтому я смог достичь своей цели следующим образом:

_request.RenameTo = "/archive/filename.txt"

и я больше не получаю ошибку 550.

2 голосов
/ 05 мая 2011

Ответ, описанный выше, не работал для меня.Это также не помогло мне:

Что на самом деле произошло вВ моем случае полный путь, куда я хотел переместить мой файл, был добавлен к старому пути, как если бы он был относительным местоположением из текущего местоположения файлов.например, у меня есть файл на ftp: //127.0.0.1/usr/john/temp/file.fmf, и я хочу переместить его на ftp: //127.0.0.1/usr/mary/archive/file.fmf.Я использовал (и это работало в .Net Framework 3.5 и ранее):

        FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://127.0.0.1/usr/john/temp/file.fmf"));
        ftp.Credentials = new NetworkCredential(this.UserName, this.Password);
        ftp.KeepAlive = true;
        ftp.UsePassive = true;
        ftp.Method = WebRequestMethods.Ftp.Rename;

        ftp.RenameTo = "usr/mary/archive/file.fmf";

        ftp.UseBinary = true;
        FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();

Но не в .Net Framework 4.0.В трассировке System.Net я обнаружил, что пытался заменить файл на usr / john / temp / usr / mary / archive / file.fmf.Это место действительно не существовало.Поэтому я изменил RenameTo на относительный путь:

        ftp.RenameTo = "../../mary/archive/file.fmf";

И снова файл был перемещен в новое местоположение.

Хотя я вижу это просто как обходной путь, а не как решение ихотя я понятия не имею, как ее решить, я рад, что она снова работает.

1 голос
/ 12 ноября 2010

Хорошо, у меня есть работа.Как вы могли видеть, версия VS.NET 2008 также выдает команду изменения каталога: «CWD / users / company /», то есть , а не , в версии VS.NET 2010. недокументированное (по крайней мере из того, что я прочитал), но работоспособное решение состоит в использовании экранирующих символов /% 2f только в URI запроса между папками, которые разрешены в качестве текущего каталогапри входе на сервер.По сути, я должен был быть явным и указать абсолютный путь, используя эти специальные escape-символы только между папками по умолчанию.Новая строка кода запроса URL-адреса выглядит следующим образом:

Dim Request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://sftp.mycompany.com/%2fusers/%2fcompany/myfile.txt")), FtpWebRequest)

Я полагаю, что это, вероятно, проблема, которая возникнет только у тех из вас, кто входит на FTP-серверы, где вы решаете каталог по умолчаниюавтоматически, и может даже не предоставить этот каталог в URI запроса.

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