Используйте C# для FTP-файла на мейнфрейме, включая набор данных. Переведите FTP-скрипт в код FtpWebRequest.

Я использую cmd (Windows) для отправки файла на мейнфрейм IBM и отлично работает, это примерно так:

Open abc.wyx.state.aa.bb
User
Pass
lcd c:\Transfer>
Put examplefile 'ABCD.AA.C58FC.ABC1FD.ZP3ABC'
close
bye

Мне нужно преобразовать это в С#. Я пытался использовать FtpWebRequest, но безуспешно. Я не могу понять, как включить набор данных, я думаю. Когда я запускаю приложение, я получаю следующую ошибку:

((System.Exception)(ex)).Message "Удаленный сервер вернул ошибку: (550) Файл недоступен (например, файл не найден, нет доступа)". 550 Невозможно сохранить Удаленный сервер вернул ошибку: (550) Файл недоступен (например, файл не найден, нет доступа).

((FtpWebResponse)ex.Response).StatusDescription "550 Невозможно сохранить /'ABCD.AA.C58FC.ABC1FD.ZP3ABC/examplefile'\r\n"

Вот что я получил в С#

string user = "user";
string pwd = "password";

string ftpfullpath = @"ftp://abc.wyx.state.aa.bb//'ABCD.AA.C58FC.ABC1FD.ZP3ABC'/examplefile'";

try
{
     FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
     ftp.Credentials = new NetworkCredential(user, pwd);

     ftp.KeepAlive = true;
     ftp.UseBinary = false;  //Use ascii.              

     ftp.Method = WebRequestMethods.Ftp.UploadFile;

     FileStream fs = File.OpenRead(inputfilepath);
     byte[] buffer = new byte[fs.Length];
     fs.Read(buffer, 0, buffer.Length);
     fs.Close();

     Stream ftpstream = ftp.GetRequestStream();
     ftpstream.Write(buffer, 0, buffer.Length);
     ftpstream.Close();
}
catch (WebException ex)
{
     String status = ((FtpWebResponse)ex.Response).StatusDescription;
     throw new Exception(status);
}

person Albert Torres    schedule 20.05.2015    source источник
comment
Вы думали о том, чтобы заглянуть в Process.Start для запуска пакетного файла или хотите отправить его, используя строго код C # ..? Вы гуглили, как подключиться и отправить файл через FTP с помощью С#.. в Интернете есть множество примеров   -  person MethodMan    schedule 20.05.2015
comment
Да, это должно быть на С#, и да, я смотрю ссылку, но мне она не помогла. Я использую те же учетные данные, что и мой пакетный файл, у которого нет проблем с загрузкой файла.   -  person Albert Torres    schedule 21.05.2015
comment
Я просто обновляю сообщение об ошибке и заменяю x фиктивными именами. examplefiles — это настоящее имя, которое я использую в сценарии cmd, и оно работает.   -  person Albert Torres    schedule 21.05.2015
comment
Обновлено!, в следующий раз буду внимательнее, чтобы не пропустить ни одного вопроса.   -  person Albert Torres    schedule 22.05.2015
comment
Ценить это. Я сейчас уберу комментарии. Вы получили мой голос сегодня утром.   -  person Bill Woodger    schedule 22.05.2015


Ответы (1)


Вы не указали, на какой платформе запускаете скрипт ftp. Я предполагаю, что Windows.

Когда вы используете команду Windows ftp put, например:

put localpath remotepath

это приводит к следующему вызову на FTP-сервере:

STOR remotefile

Точно так же, если вы используете FtpWebRequest с URL-адресом, например

ftp://example.com/remotepath

это приводит к следующему (тому же) вызову на FTP-сервере:

STORE remotepath

Обратите внимание, что первая косая черта после имени хоста (example.com) опущена.


Это означает, что ваши команды сценария ftp:

Open abc.wyx.state.aa.bb
...
Put examplefile 'ABCD.AA.C5879.ABC123.123ABC'

перевести на FtpWebRequest URL-адрес, например:

string ftpfullpath = @"ftp://abc.wyx.state.aa.bb/'ABCD.AA.C5879.ABC123.123ABC'";

Оба приводят к этому вызову на FTP-сервере:

STOR 'ABCD.AA.C5879.ABC123.123ABC'

Напротив, ваш код ftp с

string ftpfullpath = @"ftp://abc.wyx.state.aa.bb//'ABCD.AA.C5879.ABC123.123ABC'/examplefile'";

приводит к:

STOR /'ABCD.AA.C5879.ABC123.123ABC'/examplefile'

Это не выглядит правильным для мейнфрейма.


Расшифровка сеанса по моему коду C#:

USER user
331 Password required for user
PASS password
230 Logged on
OPTS utf8 on
200 UTF8 mode enabled
PWD
257 "/" is current directory.
TYPE A
200 Type set to A
PASV
227 Entering Passive Mode (zzz,zzz,zzz,zzz,193,162)
STOR 'ABCD.AA.C5879.ABC123.123ABC'
150 Connection accepted
226 Transfer OK

Расшифровка сеанса моим ftp скриптом:

USER user
331 Password required for user
PASS password
230 Logged on
PORT zzz,zzz,zzz,zzz,193,186
200 Port command successful
STOR 'ABCD.AA.C5879.ABC123.123ABC'
150 Opening data channel for file transfer.
226 Transfer OK
QUIT
221 Goodbye

Я протестировал это на FTP-сервере FileZilla, поэтому очевидно, что ответы FTP-сервера будут отличаться на FTP-сервере мейнфрейма. Но команды FTP от клиента должны быть одинаковыми.

person Martin Prikryl    schedule 21.05.2015
comment
Может быть, я что-то упустил, но где в вашем коде есть ссылка на имя файла, который я пытаюсь загрузить «examplefile» - person Albert Torres; 21.05.2015
comment
Действительно, файл примера Put 'ABCD.AA.C5879.ABC123.123ABC' в командной строке Windows работает. как ваш код эквивалентен моему ftp-коду, если ваш не включает имя файла? или, может быть, это по-другому, что я просто не понимаю. как я могу написать код С# для загрузки файла примера файла в набор данных «ABCD.AA.C5879.ABC123.123ABC»? - person Albert Torres; 21.05.2015
comment
Имя файла находится в inputfilepath (значение того, что не показано в вашем коде, но я предполагаю, что оно относится к локальному файлу с именем examplefile = эквивалент первого аргумента вашей команды Put). - person Martin Prikryl; 21.05.2015
comment
ОНО РАБОТАЕТ!! Я просто удалил имя файла из ftpfullpath, оставив его только во входном пути к файлу. Большое спасибо, что нашли время, чтобы помочь мне. - person Albert Torres; 21.05.2015