2011-04-05 89 views
0

我一直在尝试一段时间来建立一个通过C#与我们的大型机的FTP连接。到目前为止,我已经能够连接并上传一个文件到大型机,这很棒,但文件的记录长度错误,并且设置为变量,而不是固定的记录长度。经过相当多的研究后,我得出了与大多数人相同的结论,即ftpwebresponse函数不允许将“qoute SITE”命令发布到大型机。如果我错了,请不要犹豫,指正,继承人的代码我使用:C#与命令行FTP帮助

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,但环顾四周,似乎只有一条命令可以由此发出。

所以我的问题是,我知道需要一段时间才能到达那里,是否有可能在命令提示符下运行下面的命令而不使用批处理文件,因为我在过程运行时查看一些反馈?

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

然后,一旦连接已经建立

然后运行预先定义的命令,即上传文件,上传和运行JCL作业。 我想我正在寻找的东西会写文本到cmd.exe,但保持会话?

我希望这是有道理的。

任何帮助将不胜感激。

感谢

回答

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

我试着实现你的代码,但无法这样做。 Visual Studio不喜欢var,它说它没有名称空间?其中writeline不起作用,它说它不能将system.diagnostics转换为system.io。有什么建议么? – John 2011-04-06 17:32:27

+0

@John:'var'是c#3关键字。只需用'Process'替换第一个'var'并用'StreamWriter'替换第二个'var' – 2011-04-07 07:34:27

0

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

+0

我需要对套接字进行一些研究,因为我从未实现过它们。谢谢 – John 2011-04-06 17:33:37

0

你可以尝试的另一种方法是提交一个jcl作业来分配你的过程需要的记录长度,块大小等数据集。

一旦该作业完成,将数据“放入”刚刚分配的数据集中。 z/OS ftp服务器应该从现有数据集中提取属性。

0

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

1

试试这个CMD:

FTP -s:ftpcommandfilename url 

感追随模式只能一个命令来运行,你可以写的FTP cmd在一个文件,并使用此CMD执行它们。

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

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