尝试使用 C# 从 IBM 大型机下载

Posted

技术标签:

【中文标题】尝试使用 C# 从 IBM 大型机下载【英文标题】:Trying to download from IBM mainframe using C# 【发布时间】:2015-08-25 14:01:12 【问题描述】:

我找到了一个 Windows 命令行 sn-p 来从一个有效的 IBM Z/OS 大型机下载一个文件,现在我想使用 C# 和 .NET 复制这个代码。下面是两个 Windows 命令行文件:

BatchFtp.bat:

rem 999.999.99.99 is mainframe IP Address
ftp -s:C:\scripts\script.txt 999.999.99.99
pause

C:\scripts\script.txt:

myid
MyPwd
cd ..
get "GIO.END.GPROD.PROC(MYDSNAME)" "c:\scripts\GIO.END.GPROD.PROC(MYDSNAME).txt"
quit

我已经尝试了几个 C# FTP 开源示例,包括以下示例,但我都遇到了错误。

例如,执行以下代码时,我得到一个错误

远程服务器返回错误:(425) 无法打开数据连接。

执行此行时:

ftpStream = ftpResponse.GetResponseStream();

这是我执行的代码:

private void button1_Click(object sender, EventArgs e)

    /* Download a File */
    Ftp ftpClient = new Ftp("999.999.99.99", "MyUserIdHere", "MypasswordHere");

    ftpClient.download(@"GIO.END.GPROD.PROC(DsNmHere)", @"'c:\junk\GIO.END.GPROD.PROC(DsNmHere).txt'");


class Ftp

    private string host = null;
    private string user = null;
    private string pass = null;
    private FtpWebRequest ftpRequest = null;
    private FtpWebResponse ftpResponse = null;
    private Stream ftpStream = null;
    private int bufferSize = 2048;

    /* Construct Object */

    public Ftp(string hostIP, string userName, string password)
    
        host = hostIP; 
        user = userName; 
        pass = password;
    

    /* Download File */
    public void download(string remoteFile, string localFile)
    
        try
        
            /* Create an FTP Request */

            string fullPath = @"ftp://" + this.host + "/'" + remoteFile + "'";

            ftpRequest = (FtpWebRequest) FtpWebRequest.Create(fullPath);
            /* Log in to the FTP Server with the User Name and Password Provided */
            ftpRequest.Credentials = new NetworkCredential(user, pass);
            /* When in doubt, use these options */
            ftpRequest.UseBinary = false;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive = true;
            /* Specify the Type of FTP Request */
            ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            /* Establish Return Communication with the FTP Server */
            ftpResponse = (FtpWebResponse) ftpRequest.GetResponse();
            /* Get the FTP Server's Response Stream */
            ftpStream = ftpResponse.GetResponseStream();
            /* Open a File Stream to Write the Downloaded File */
            FileStream localFileStream = new FileStream(localFile, FileMode.Create);
            /* Buffer for the Downloaded Data */
            byte[] byteBuffer = new byte[bufferSize];
            int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
            /* Download the File by Writing the Buffered Data Until the Transfer is Complete */
            try
            
                while (bytesRead > 0)
                
                    localFileStream.Write(byteBuffer, 0, bytesRead);
                    bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                
            
            catch (Exception ex)
            
                Console.WriteLine(ex.ToString());
            
            /* Resource Cleanup */
            localFileStream.Close();
            ftpStream.Close();
            ftpResponse.Close();
            ftpRequest = null;
        
        catch (Exception ex)
        
            System.Windows.Forms.MessageBox.Show(ex.Message);
            Console.WriteLine(ex.ToString());
        
        return;
    
    

我假设我的 URL 一定是错误的。连接后,如何处理工作批处理文件示例中的cd(更改目录)命令?

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

查看问题的右侧,在侧边栏中的“相关”下方。有什么用吗? 我看了很多帖子,包括那些。还没有任何工作。谢谢... 这个? ***.com/q/30357969/1927206。右上角的搜索框,输入[mainfame] and [c#] and [ftp]。在过去的几个月里,它以两到三种方式出现。确保您按最近的顺序查看。 【参考方案1】:

您的 ftp.exe 脚本使用主动 FTP 模式。 (ftp.exe 只支持主动模式。)

虽然您的 C# 代码使用被动 FTP 模式。并且存在一些问题,如 “无法打开数据连接” 消息所示。

删除此行尝试使用活动模式:

ftpRequest.UsePassive = true;

但请注意,通常被动模式的问题往往较少。见my guide to understand why the passive mode prevails nowadays。但是,当您证明活动模式适用于您的情况时,请坚持下去。


回答您的其他问题:无法使用FtpWebRequest 发出cd 命令。只需使用完整路径即可:

ftp://host/../remotefile

../ 代替了cd ..

有关在 IBM 大型机 FTP 服务器上使用 FtpWebRequest 的路径的一般信息,请参阅:Use C# to FTP file to mainframe including dataset - Translate FTP script to FtpWebRequest code

【讨论】:

我删除了引号,因为我看到了一个帖子,所以我添加了这些引号。我将 UsePassive 更改为 true,现在我收到错误消息“附加信息:远程服务器返回错误:(550) 文件不可用(例如,找不到文件,无法访问)。”这对我来说似乎是进步。但我知道该文件存在并且我可以访问,因为 DOS 版本有效,所以 fullPath 一定不正确。谢谢! ftp://host/../GIO.END.GPROD.PROC(MYDSNAME) 怎么样(/../ 用于cd .. 你就是我希望见到的人 :-) @Martin,很好的建议(“..”),但我得到了同样的错误。谢谢。 我在文件名周围重新添加了单引号,它起作用了! 99.99.999.9/../'GIO.END.GPROD.PROC(MYDSNNM)'谢谢你的帮助,否则我可能不会想出来。

以上是关于尝试使用 C# 从 IBM 大型机下载的主要内容,如果未能解决你的问题,请参考以下文章

使用 Octokit (c#, .net) 从大型 github 企业存储库中高效下载单个文件

有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?

有没有办法从 IBM 大型机批处理程序中的第 10 条记录开始读取 ESDS 文件?

C# - 在没有许可证的情况下连接到 DB2 z/os 大型机

将大型虚拟文件从 C# 拖放到 Windows 资源管理器

ibm小型机操作系统初始化失败