我正在尝试使用C#将文本文件(转换为ebcdic)上传到MVS中的库中。为了上传文件,我使用了以下字符串:filename = @“ftp://xx.xx.xx.xx//'myFile'”;没有撇号是不可能的 现在,我使用@“ftp://xx.xx.xx.xx//'libary_name(myFile)'”上传到库中,但是我得到了错误的语法或参数错误。库名:user_id.xyz.temp_lib和myFile:user_id.xyz.someFile。我该如何解决这个问题?
另外,有没有办法在c#中控制文本文件的块大小? MVS当前将上传的文件声明为VB,但我希望它为FB(当然指定长度)。
由于
答案 0 :(得分:1)
两个想法......
您的第一个示例表明对MVS文件名的基本误解。
与Unix,DOS或MS Windows不同,没有文件夹或“路径”这样的东西。整个MVS文件在系统目录中通过其唯一的数据集名称定义,该名称不能超过44个字符。该文件的组织结构可能不同,可能有也可能没有内部目录或索引。它可以是一个简单的平面文件,也可以是PDS,VSAM,GDG或数据库等。您必须了解正在使用的文件类型才能正确使用它。
在这种情况下,您将其称为“库”,并进一步表明此库具有成员名称,该名称强烈暗示该文件被组织为PDS数据集。作为PDS,有一个内部目录,您可以拥有多个成员,但没有一个成员名称可能超过8个字节。成员名称计入文件名的44字节名称空间限制。正如Erf指出的那样,PDS会员名称仅限于字母,数字和一些国家字符。成员中的数据按顺序访问。
在您的第一个示例中,您指出成员名称为:user_id.xyz.someFile
该名称显然无效,因为它超过了8字节限制。如果您缩短了您的示例可能有用的名称。实际上,在您更正的示例中,您通过创建名为“someFile”的PDS成员修复了非法成员名称问题,并且该问题完全有效。
第二个想法......该声明听起来不正确,表示您可能不允许FTP会话自动将用户ID附加到您的文件名。虽然允许FTP默认您的文件名工作正常,但在大多数情况下,您应该明确限定整个MVS文件名。
如果没有撇号,FTP应默认将您的用户ID附加到MVS文件名。以下名称相同......
@"ftp://xx.xx.xx.xx//libary_name(aMember)"
@"ftp://xx.xx.xx.xx//'user_id.libary_name(aMember)'"
使用撇号,FTP要求您明确命名完全限定的MVS文件名。 它不会为您附加用户ID。
此示例显示了差异:
@"ftp://xx.xx.xx.xx//libary_name(aMember)" <- user_id.libary_name(aMember)
@"ftp://xx.xx.xx.xx//'xyz.libary_name(aMember)'" <- xyz.libary_name(aMember)
你提到FTP没有撇号就行不通。这让我感到惊讶。您是否尝试过使用C#转义双引号(\“)字符?我认为这样也可以。
答案 1 :(得分:0)
修正了它!
而不是@“ftp://xx.xx.xx.xx//'libary_name(myFile)'”其中库名:user_id.xyz.temp_lib和myFile:user_id.xyz.someFile,你必须使用 @“ftp://xx.xx.xx.xx//'libary_name(someFile)'”如果在此命令中使用完整的MVS数据集路径,则会出错。
答案 2 :(得分:0)
对于MVS ftp服务器,不使用MVS样式数据集名称。数据集名称中的每个节点都被视为目录。例如,如果您以“/”开头,则可以:
chdir user_id chdir xyz chdir temp_lib LS
会为您提供库user_id.xyz.temp_lib中所有成员的列表。
要上传,请尝试@“ftp:/xx.xx.xx.xx/user_id/xyz/temp_lib/myFile”。
要在FB中获取文件,可以使用DCbdsn命令:
214-DCbdsn = data_set指定FTP应分配任何新数据集 214-具有与该数据集相同的属性。 Data_set是 214-引号中的完全限定数据集名称 214-或附加到当前目录名称前缀。 214- Blocksize,lrecl,recfm和retpd参数将被覆盖 214-模型数据集特征(如果已指定)。
您也可以独立使用Blocksize,lrecl或recfm选项。