我一直在尝试将.net中的dtl文件ftp转换为我认为的AS400。报告给我的错误是:“一行或多行被截断”,管理员说该文件已经过来,256行有可变长度列。我在网上找到了这个解释:
我们必须建立默认值,因为不存在关于该文件的细节。默认的RECFM是V,LRECL是256.这意味着SAS将扫描输入记录,寻找CR& LF告诉我们我们处于EOR状态。如果未在LRECL的限制内找到标记,则SAS将LRECL值中的数据丢弃到记录的末尾,并向日志添加“一条或多条线路已被截断”的消息。
所以我需要设置LRECL。我如何在C#.NET中执行此操作?
FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
ftp.Credentials = new NetworkCredential(user, pwd);
ftp.KeepAlive = false;
ftp.UseBinary = false;
ftp.Method = WebRequestMethods.Ftp.UploadFile;
FileStream fs = File.OpenRead(inputfilepath + ftpfileName);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
Stream ftpstream = ftp.GetRequestStream();
int i = 0;
int intBlock = 1786;
int intBuffLeft = buffer.Length;
while (i < buffer.Length)
{
if (intBuffLeft >= 1786)
{
ftpstream.Write(buffer, i, intBlock);
}
else
{
ftpstream.Write(buffer, i, intBuffLeft);
}
i += intBlock;
intBuffLeft -= 1786;
}
ftpstream.Close();
答案 0 :(得分:0)
1786不能被256整除。
我认为你不需要用ftpWebRequest来分割流内容。
你试过吗
StreamReader sourceStream = new StreamReader(fileName);
byte [] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
ftp.ContentLength = fileContents.Length;
Stream ftpstream = ftp.GetRequestStream();
ftpstream.Write(fileContents, 0, fileContents.Length);
ftpstream.Close();