【问题标题】:FTP download converts CrLf to LfFTP 下载将 CrLf 转换为 Lf
【发布时间】:2015-07-02 08:15:48
【问题描述】:

我正在使用此代码从 FTP 服务器下载文本文件(目录包含来自 FTP 服务器的文件/目录列表):

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。

【问题讨论】:

    标签: c# ftp


    【解决方案1】:

    您有fileFtpRequest.UseBinary = true;,并且您在下载端使用二进制文件流。

    因此,转换任何内容的不是 FTP 客户端,您想要的是 FilZilla 显然可以进行但您没有得到的转换。

    您可以尝试使用UseBinary=false,但文档对效果含糊不清。

    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
       }
    }
    

    【讨论】:

    • UseBinary = false; 做到了。我问过的每个人都告诉我,我必须将其设置为 true,并且我必须寻找其他地方 -.- 感谢您的快速回答!
    【解决方案2】:

    FTP 的“二进制”传输模式精确地逐字节复制文件。简单明了。

    但是,当在不同操作系统之间传输文本文件时,这可能不是您想要的——不同的操作系统使用不同的代码来表示换行符。为此目的存在“ASCII”模式:它自动将所有行尾从源系统的格式转换为目标的格式。 LINK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多