C # с помощью командной строки FTP - PullRequest
0 голосов
/ 05 апреля 2011

Я уже некоторое время пытаюсь установить соединение ftp с нашим мэйнфреймом через c #. До сих пор я был в состоянии подключиться и загрузить файл на мэйнфрейм, и это здорово, но файл имеет неправильную длину записи и настроен как переменная, а не фиксированная длина записи. После небольшого исследования я пришел к тому же выводу, что и большинство людей, что функция ftpwebresponse не позволяет командам «qoute SITE» отправляться на мэйнфрейм. Если я ошибаюсь, пожалуйста, не стесняйтесь меня поправлять, вот код, который я использую:

private void ftpButton_Click(object sender, EventArgs e)
{
    string ftphost = "ftpSite";  
    string user = "myUser";  
    string pwd= "myPass";
    string ftpfileName = "test.file2";
    string inputfilePath="d:\\documents and settings\\gheff\\My Documents\\Visual Studio 2005\\Projects\\biWeeklyJob\\BiWeekly\\bin\\Debug\\file2.TXT";

    string ftpfullpath = String.Format("ftp://{0}//'{1}'", ftphost,ftpfileName);             

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

Итак, я не задумывался над другим подходом: я успешно использовал командную строку для загрузки файла, изменения свойств файла, а также изменил тип файла, чтобы я мог отправлять задания JCL на мэйнфрейм. Сейчас я пытаюсь реализовать это в моем существующем приложении на c #, но это оказалось сложнее, чем я думал.

Я ни в коем случае не эксперт в c #, но могу использовать ответы, чтобы потом пойти и провести дополнительные исследования, чтобы лучше понять.

Я видел этот фрагмент кода C # cmd excute команды , но, оглядываясь вокруг, кажется, что из этого может быть выдана только одна команда.

Итак, мой вопрос: я знаю, что это заняло какое-то время, возможно ли выполнить следующие команды в командной строке без использования командного файла, так как я просматриваю некоторую обратную связь по мере выполнения процесса?

open "cmd.exe"
type "ftp"
type "FTPserver"
Type "USERNAME"
type "PASSWORD"

Затем, как только соединение будет установлено

затем выполните предопределенные команды, т.е. загрузите файлы, загрузите и запустите задания JCL. Я думаю, что я ищу что-то, что напишет текст в cmd.exe, но продолжит сеанс?

Надеюсь, это имеет смысл.

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 5 ]

1 голос
/ 02 мая 2012

Попробуйте этот cmd:

FTP -s:ftpcommandfilename url

означает, что следующий режим может выполнять только одну команду, вы можете записать ftp cmd в файл и использовать этот cmd для их выполнения.

WriteLine("FTP -s:ftpcommandfilename url");

Кстати, я также нахожу режим multi-ftp-cmd-line-in-code, если он у вас есть, вы делитесь?

1 голос
/ 05 апреля 2011

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

var cmd= new Process();

cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardInput = true;

cmd.Start();

using (var stdin = cmd.StandardInput)
{
   stdin.WriteLine("ftp");
   stdin.WriteLine("FTPserver");
   stdin.WriteLine("USERNAME");
   stdin.WriteLine("PASSWORD");
} 

cmd.WaitForExit();
cmd.Close();
0 голосов
/ 07 апреля 2011

Рассматривали ли вы использование коммерческого FTP-клиента, который поддерживает интерфейс COM и может отправлять необработанные команды протокола?Это может быть неэкономично, если вы пишете программное обеспечение для перераспределения, но если вы пытаетесь автоматизировать только повторяющуюся задачу для внутреннего ИТ-проекта, оно определенно может стоить вашего времени в качестве разработчика.Robo-FTP может быть хорошим выбором для подключения к мэйнфрейму, потому что он встроен в перевод ASCII в EBCDIC.

0 голосов
/ 06 апреля 2011

Другой подход, который вы можете попробовать, - это отправить jcl-задание для выделения набора данных с длиной записи, размером блока и т. Д., Которые нужны вашему процессу.

Как только это задание завершится, «поместите» свои данныев набор данных, который вы только что правильно разместили.Ftp-сервер z / OS должен выбрать атрибуты из существующего набора данных.

0 голосов
/ 05 апреля 2011

Я использовал этот проект CodeProject несколько лет назад для простого приложения, которому нужно было отправить некоторые файлы. Вам может помочь то, что он использует сокет для связи с другим сервером. Вы можете отправлять необработанные команды FTP, которые должны обойти проблемы, возникающие у вас с объектом FtpWebRequest, без необходимости «выкладывать» и использовать программу командной строки ftp.

...