C#用命令行FTP帮助

时间:2011-04-05 15:28:34

标签: c# command-line ftp cmd mainframe

我已经尝试了一段时间,通过c#与我们的大型机建立ftp连接。到目前为止,我已经能够连接并将文件上传到大型机,这很棒,但文件的记录长度错误,并设置为变量,而不是固定的记录长度。经过相当多的研究后,我得出了与大多数人相同的结论,即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 commands,但环顾四周似乎只能发出一个命令。

所以我的问题是,我知道它需要一段时间才能到达那里,是否可以在命令提示符下运行follow命令而不使用批处理文件,因为我正在寻找一些反馈,因为进程运行? / p>

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

然后一旦建立连接

然后运行预定义的命令,即上传文件,上传和运行JCL作业。 我认为我正在寻找的是将文本写入cmd.exe但保留会话的东西吗?

我希望这是有道理的。

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:1)

所以这里是你要求的代码,但我怀疑它能解决你的问题。

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

答案 1 :(得分:1)

试试这个cmd:

FTP -s:ftpcommandfilename url

感觉跟随模式只能运行一个命令,你可以在文件中写入ftp cmd并使用这个cmd来执行它们。

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

顺便说一句,我也找到了多ftp-cmd-line-in-code模式,如果你有它,共享?

答案 2 :(得分:0)

几年前我用这个CodeProject project作为一个需要发送一些文件的简单应用程序。可能对您有所帮助的是它使用套接字与其他服务器通信。您可以发送原始FTP命令,这些命令应该回避您使用FtpWebRequest对象时遇到的问题,而不必“shell out”并使用ftp命令行程序。

答案 3 :(得分:0)

您可以尝试的另一种方法是提交一个jcl作业来分配数据集,其中包含您的流程所需的记录长度,块大小等。

完成该工作后,将您的数据“放入”刚刚正确分配的数据集中。 z / OS ftp服务器应该从现有数据集中获取属性。

答案 4 :(得分:0)

您是否考虑过使用支持COM接口且能够发送原始协议命令的商用FTP客户端?如果您正在编写软件来重新分发这可能不经济,但如果您只是尝试为内部IT项目自动执行重复任务,那么就您作为开发人员的时间来说,它绝对是值得的。 Robo-FTP可能是连接大型机的不错选择,因为它内置了ASCII到EBCDIC的转换。