2015-05-20 3 views
2

я использую CMD (для Windows) для отправки файла на мэйнфреймы IBM и работает отлично, это что-то вроде этого:Использование C# для FTP-файл в мэйнфреймы, включая набор данных - Перевести FTP скрипт для FtpWebRequest кода

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

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

((System.Exception)(ex)).Message "The remote server returned an error: (550) File unavailable (e.g., file not found, no access)." 550 Unable to store The remote server returned an error: (550) File unavailable (e.g., file not found, no access).

((FtpWebResponse)ex.Response).StatusDescription "550 Unable to store /'ABCD.AA.C58FC.ABC1FD.ZP3ABC/examplefile'\r\n"

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

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); 
} 
+1

Вы задумывались над тем, чтобы заглянуть в 'Process.Start', чтобы запустить пакетный файл или вы хотите отправить его, используя строго код C# ..? у вас есть googled, как подключиться и отправить файл через FTP с помощью C# .. Есть много примеров онлайн – MethodMan

+0

Да, это должно быть на C#, и да, я смотрю ссылку, но я не мог найти ее полезной для меня. Я использую те же учетные данные, что и мой командный файл, у которого нет проблем с загрузкой файла. –

+0

Я просто обновляю сообщение об ошибке и заменяю x пустыми именами. examplefiles - настоящее имя, которое я использую в скрипте cmd и работает. –

ответ

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 

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

+0

Возможно, я что-то пропустил, но где на вашем коде есть ссылка на имя файла, который я пытаюсь загрузить 'examplefile' –

+0

Действительно, пример файла примера 'ABCD.AA.C5879.ABC123.123ABC' работает в командной строке Windows. как ваш код является эквивалентом моего ftp-кода, если вы не включаете имя файла? или, может быть, это по-другому, что я просто не понимаю. как я могу написать код C# для загрузки файла примера файла в набор данных «ABCD.AA.C5879.ABC123.123ABC»? –

+0

Имя файла находится в 'inputfilepath' (значение того, что не показано в вашем коде, но я предполагаю, что это относится к локальному файлу с именем' examplefile' = эквивалент первого аргумента вашей команды 'Put'.). –