【问题标题】:After transmission of text files blank lines appears in them传输文本文件后出现空白行
【发布时间】:2026-01-30 13:25:02
【问题描述】:

编辑:Filezilla 引起了问题,当我从服务器下载文件时,它添加了新行。很抱歉造成混乱。


此方法上传文件到ftp服务器,效果很好,但是上传到服务器的文本文件每行后出现空行(出现“cr lf”),例如:

File: 
First line
Second line
Third line

Uploaded file:
First line

Second line

Third line

源文件和上传文件相应大小不同,非文本文件相同。

代码:

private void sendFile(string In, string Out)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create("ftp://domain//" + Out);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("username", "password");             

    FileStream sourceStream = new FileStream(In, FileMode.Open, FileAccess.Read, FileShare.Read);
    byte[] fileContents = new byte[sourceStream.Length];
    sourceStream.Read(fileContents, 0, (int) sourceStream.Length);
    sorceStream.Close();

    request.ContentLength = fileContents.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(fileContents, 0, fileContents.Length);

    requestStream.Close();
}

我该如何解决这个问题?

【问题讨论】:

  • 不相关,但您应该真正将流包裹在 using 块周围,以确保它们被正确处理。

标签: c# filestream ftpwebrequest


【解决方案1】:

编辑:由于下面的答案似乎没有帮助(但我将它留在那里以供后代使用,因为它显示了更好的代码)这里是我要检查的下一个诊断步骤:

  • 您如何查看文件?如果可能的话,直接进入服务器,而不是通过网络浏览器或其他方式再次获取文件。
  • 您要连接的 FTP 服务器是什么类型的?可能存在已知问题。
  • 您是否尝试过查看通过 Wireshark 实际发送的内容?
  • 您是否尝试过通过普通的 FTP 客户端发送相同的文件?

您应该将 FtpWebRequest.UseBinary 设置为 true 以保留准确的文件内容。否则,这两个系统将尝试自行找出行尾,并根据需要更改行终止符。我很少认为这是个好主意。 (编辑:UseBinary 默认情况下实际上是true,但这听起来像使用文本模式引入的问题的种类...明确表明这一点当然没有害处。)

另外:

  • 您应该通过using 声明处理您的FileStream
  • 您应该通过using 语句处理请求流
  • 您应该注意Stream.Read 的结果 - 它不需要总是一次性读取全部请求的数据
  • 您可以使用File.ReadAllBytes 简单地一次性读取完整的文件数据,或者使用Stream.CopyTo(如果您使用.NET 4)将FileStream 复制到请求流(这不会' t 设置内容长度,当然;我不知道这是否有问题)
  • 你永远不会打电话给GetResponse;如果您从不获取 FtpWebRequest 的响应,则不清楚究竟会发生什么
  • 您的参数名称不符合 .NET 命名约定,并且描述性不强

所以我可能会使用:

private void SendFile(string inputFile, string outputPath)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create
        ("ftp://domain//" + outputPath);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = true;
    request.Credentials = new NetworkCredential("username", "password");

    byte[] fileContents = File.ReadAllBytes(inputFile);
    request.ContentLength = fileContents.Length;

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }

    // This *may* be necessary in order to validate that everything has happened
    using (WebResponse response = request.GetResponse())
    {
    }
}

【讨论】:

  • 这也是我想到的第一件事,但我注意到在文档中默认值已经是 true。
  • @Joe:嗯……你说得对。我会亲自将其明确设置为 True 以查看这是否会有所不同...但是 OP 的代码中存在足够多的其他问题,因此可能值得使用我的答案中显示的新版本,然后检查结果。当然有可能是OP的FTP服务器坏了……
  • @Jon Skeet:使用了您的代码,但问题仍然存在。也谢谢指正!
  • @Anatoly:我已经在开始时用更多诊断步骤编辑了我的答案。基本上它们就是我接下来要看的地方......
【解决方案2】:

这很奇怪。我面临同样的问题,直到我没有在文件中提供扩展名之前我无法修复它。例如,如果我的文件名是

abc文件

然后我将其设为 abcfile.dat,然后它将上传的文件显示为实际文件。我再次使用 abcfile.txt 上传文件,但这一次我上传的文件中再次出现空行问题。

我建议您必须为文件提供除 .txt 之外的任何扩展名。

【讨论】:

    【解决方案3】:

    您要发送到的系统使用的行尾与您的系统使用的不同。我可以假设,因为你得到一个额外的行,你在 Windows 上,它使用 CRLF 结尾。您发送到的系统将 CR 和 LF 识别为单独的结尾,因此您会得到额外的行。

    对于文本,截断 LF 或 CR,看看会发生什么。我不知道不同的文件大小。

    【讨论】:

    • (或者只使用二进制模式。您的偏好:))
    【解决方案4】:

    在FileZilla的顶部菜单中,设置:

    Transfer menu > Transfer type > binary
    

    【讨论】:

      【解决方案5】:

      在FileZilla的顶部菜单中,设置:

      Transfer menu > Transfer type > binary
      

      它对我有用。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center