使用 C# 到 FTP 文件到大型机,包括数据集 - 将 FTP 脚本翻译成 FtpWebRequest 代码

Posted

技术标签:

【中文标题】使用 C# 到 FTP 文件到大型机,包括数据集 - 将 FTP 脚本翻译成 FtpWebRequest 代码【英文标题】:Use C# to FTP file to mainframe including dataset - Translate FTP script to FtpWebRequest code 【发布时间】:2015-05-20 18:46:01 【问题描述】:

我使用 cmd (Windows) 将文件发送到 IBM 大型机并且工作正常,如下所示:

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 "远程服务器返回错误:(550) 文件不可用(例如,找不到文件,无法访问)。" 550 无法存储 远程服务器返回错误:(550) 文件不可用(例如,找不到文件,无法访问)。

((FtpWebResponse)ex.Response).StatusDescription "550 无法存储 /'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);

【问题讨论】:

您是否考虑过查看Process.Start 来运行批处理文件,或者您想使用严格的C# 代码发送它..?你用谷歌搜索过如何使用 C# 通过 FTP 连接和发送文件吗?网上有很多例子 是的,它必须在 C# 上,是的,我查看了链接,但我发现它对我没有帮助。我使用与我的批处理文件相同的凭据,上传文件没有问题。 我只是更新错误消息并将 x 替换为虚拟名称。 examplefiles 是我在 cmd 脚本中使用的真实名称,并且可以正常工作。 已更新!,下次我会更加小心,不要错过任何问题。 欣赏它。我现在要清理cmets。你今天早上投了我的赞成票。 【参考方案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 like:

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命令应该是一样的。

【讨论】:

也许我遗漏了一些东西,但你的代码在哪里是对我尝试上传“examplefile”的文件名的引用 确实在 Windows 命令提示符下放置示例文件 'ABCD.AA.C5879.ABC123.123ABC' 有效。如果您不包含文件名,您的代码如何等同于我的 ftp 代码?或者也许它以不同的方式,我只是不明白。如何编写 c# 代码将文件 examplefile 上传到数据集'ABCD.AA.C5879.ABC123.123ABC'? 文件名在inputfilepath 中(代码中未显示的值,但我认为它指的是一个名为examplefile 的本地文件= 相当于Put 的第一个参数命令。)。 它工作!我刚刚从 ftpfullpath 中删除了文件名,只保留在 inputfilepath 上。非常感谢您花时间帮助我。

以上是关于使用 C# 到 FTP 文件到大型机,包括数据集 - 将 FTP 脚本翻译成 FtpWebRequest 代码的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 python 脚本将 FTP 文件传输到大型机服务器,但在大型机数据集结束时获取特殊字符

使用 FTP 形式 Python 访问大型机数据集

将文件作为 TAPE 数据集 SFTP 到大型机

使用 FTP 和 C# 启动现有大型机作业

使用 java ftp 检查 mainfame 上是不是存在数据集

使用 FtpWebRequest 附加到大型机上的文件时出现问题