为什么PC-to-AS400,ASCII FTP传输导致AS400端的文件增长非常大?

时间:2011-07-15 13:58:56

标签: ibm-midrange

GIVEN:我是AS400平台上的新手,充其量

问题:我们需要将可变宽度,管道分隔的ASCII文件从Windows 2003服务器传输到在V6R1上运行的FTP服务器。文件到达并正确转换为EBCDIC,但它们非常庞大。 3.5Mb文件成为200+ Mb成员。 9Gb文件失败,因为我们遇到某种方式的配额。

有趣的事实:当以二进制模式(无翻译)完成时,文件在服务器端显示为FILENAME.FILE,其中一个成员名为FILENAME.MBR。传输大小是正确的,但由于ASCII编码,本机工具无法读取该文件。

有趣的事实:已经在三台V6R1机器上尝试过,结果相同。所以我很确定这是我不太了解的正常行为。

我的直觉是,服务器正在扩展文件,因为它向它添加了新行 - 但我现在真的没有更好的猜测。有没有人见过这种行为,你知道如何避免这种行为吗?

提前感谢任何花时间做出贡献的人。我很感激。

2 个答案:

答案 0 :(得分:6)

IBM i FTP服务器可以处理“经典”QSYS.LIB文件系统中的对象(其中有诸如驻留在单层库中的文件之类的对象)或集成文件系统上的流文件(分层结构)文件系统类似于Windows和Unix中使用的文件系统。

听起来您正在将文件发送到QSYS.LIB文件系统中的物理文件(PF)。 PF具有固定长度的记录,因此您可能会在大多数记录的末尾看到一些松弛空间。您可以使用DSPFD CL命令查看PF中的记录数和记录长度。

如果要将文件发送到PF,FTP服务器默认为名称格式0,即QSYS.LIB文件系统。在此模式下,您将发送给PF,如:

SEND myfile.txt DMCLIB/MYFILE.MYMBR

如果要将文件发送到流文件,则必须先向FTP服务器发送命令:

QUOTE SITE NAMEFMT 1

这会将FTP服务器切换到IFS命名模式。因此,当您发送文件时,您需要指定要将其发送到的目录。例如:

SEND myfile.txt /home/dmc/myfile.txt

如果您要发送可变长度记录,那么IFS流文件将不会像您在物理文件中看到的那样松弛。

如果管道分隔文件包含单个布局,您可以使用CPYFRMIMPF CL命令将其映射到具有实际记录格式的PF,这可能是更“原生”的方式。但是,如果它是一种更复杂的文件格式,您可能必须编写一个ILE RPG程序,将流文件转换为它需要的任何形式。Here are some great tutorials,用于访问ILE RPG的流文件。

另请注意,从命令行FTP客户端连接时,您可以使用QUOTE HELP命令从IBM i FTP服务器中看到一些有趣的帮助信息。

答案 1 :(得分:3)

AS / 400上有许多file systems可用。标准文件系统实际上是DB / 2。库是数据库/模式,物理文件是表,成员是table partition,逻辑文件是索引/视图。 IFS是基于普通流的文件系统。

Ascii模式会将以EOL字符(CR / LF)结尾的文本映射到单个物理文件记录。二进制模式忽略EOL字符和流,以及适合每条记录的原始数据。有关详细信息,请参阅File Transfer Protocol reference

使用DSPFD命令查看文件定义。 最大记录长度将指示固定长度记录大小。将其乘以要上载的记录数,以计算上载后需要多少空间。 “中档人”可能会为你创建一个文件长度非常长的文件。他们用更合适的记录长度重新创建文件应该是微不足道的,这样你就不会浪费太多空间。

创建文件时定义的最大记录数可防止磁盘填满。您可以在DSPFD命令中找到这些值初始记录数增量记录数最大增量数 。可以使用带有CHGPF参数的SIZE命令根据需要更改这些值。

另一个选择是上传到IFS文件系统并让'mid-range folks'直接从IFS处理文件。这是Working with the IFS in RPGIV的Scott Klement教程。