FTP 下载将 CrLf 转换为 Lf
FTP download converts CrLf to Lf
我正在使用此代码从 FTP 服务器下载文本文件(目录包含来自 FTP 服务器的 files/directories 的列表):
for (int i = 0; i <= directories.Count - 1; i++)
{
int bytesRead = 0;
byte[] buffer = new byte[2048];
string trnsfrpth = f.getConfig("TempPath") + @"/" + directories[i].ToString();
if (directories[i].Contains(".") && !(directories[i].ToString().Equals(".") || directories[i].ToString().Equals("..")))
{
FtpWebRequest fileFtpRequest = (FtpWebRequest)WebRequest.Create(f.getConfig("FTP") + @"/" + directories[i].ToString());
fileFtpRequest.UseBinary = true;
fileFtpRequest.Credentials = credentials;
fileFtpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream();
FileStream fileStream = new FileStream(trnsfrpth, FileMode.Create);
while (true)
{
bytesRead = fileResponse.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
}
我得到的文件都有LF作为换行符。我不是 100% 确定文件以 CR LF 换行符开头。但是如果我通过 FileZilla 下载它们,它们会使用 CR LF。我需要文件的 CR LF 版本。我想问一下我这里是不是做错了什么,或者这段代码是否可以,FileZilla 在下载时自动转换文件,我必须手动替换 LF。
您有 fileFtpRequest.UseBinary = true;
并且在下载端使用二进制 FileStream。
因此,转换任何内容的不是 FTP 客户端,您想要 FilZilla 显然可以进行但您没有得到的转换。
您可以尝试使用 UseBinary=false
,但文档对效果含糊不清。
A StreamReader 接受 '\n',因此您可以将 while(true)
部分替换为
using (Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream())
using (var reader = new StreamReader(fileResponse))
{
string line;
while ((line = reader.ReadLine()) != null)
{
something.WriteLine(line); // here you get the .NET line ending
}
}
FTP 的 "Binary" 传输模式准确地逐字节复制文件。简单明了。
但是,当在不同的操作系统之间引入文本文件时,这可能不是您想要的——不同的操作系统使用不同的代码来表示换行符。 "ASCII" 模式就是为了这个目的而存在的:它自动将所有行结尾从源系统的格式转换为目标系统的格式。
LINK
我正在使用此代码从 FTP 服务器下载文本文件(目录包含来自 FTP 服务器的 files/directories 的列表):
for (int i = 0; i <= directories.Count - 1; i++)
{
int bytesRead = 0;
byte[] buffer = new byte[2048];
string trnsfrpth = f.getConfig("TempPath") + @"/" + directories[i].ToString();
if (directories[i].Contains(".") && !(directories[i].ToString().Equals(".") || directories[i].ToString().Equals("..")))
{
FtpWebRequest fileFtpRequest = (FtpWebRequest)WebRequest.Create(f.getConfig("FTP") + @"/" + directories[i].ToString());
fileFtpRequest.UseBinary = true;
fileFtpRequest.Credentials = credentials;
fileFtpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream();
FileStream fileStream = new FileStream(trnsfrpth, FileMode.Create);
while (true)
{
bytesRead = fileResponse.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
}
我得到的文件都有LF作为换行符。我不是 100% 确定文件以 CR LF 换行符开头。但是如果我通过 FileZilla 下载它们,它们会使用 CR LF。我需要文件的 CR LF 版本。我想问一下我这里是不是做错了什么,或者这段代码是否可以,FileZilla 在下载时自动转换文件,我必须手动替换 LF。
您有 fileFtpRequest.UseBinary = true;
并且在下载端使用二进制 FileStream。
因此,转换任何内容的不是 FTP 客户端,您想要 FilZilla 显然可以进行但您没有得到的转换。
您可以尝试使用 UseBinary=false
,但文档对效果含糊不清。
A StreamReader 接受 '\n',因此您可以将 while(true)
部分替换为
using (Stream fileResponse = fileFtpRequest.GetResponse().GetResponseStream())
using (var reader = new StreamReader(fileResponse))
{
string line;
while ((line = reader.ReadLine()) != null)
{
something.WriteLine(line); // here you get the .NET line ending
}
}
FTP 的 "Binary" 传输模式准确地逐字节复制文件。简单明了。
但是,当在不同的操作系统之间引入文本文件时,这可能不是您想要的——不同的操作系统使用不同的代码来表示换行符。 "ASCII" 模式就是为了这个目的而存在的:它自动将所有行结尾从源系统的格式转换为目标系统的格式。 LINK