C# 传输文本文件后,其中会出现空行

C# 传输文本文件后,其中会出现空行,c#,filestream,ftpwebrequest,C#,Filestream,Ftpwebrequest,编辑:Filezilla导致了这个问题,当我从服务器下载文件时,它添加了新行。很抱歉搞混了 此方法将文件上载到ftp服务器,工作正常,但在上载到服务器的文本文件中,每行后面都会出现空行(“cr lf”出现),例如: File: First line Second line Third line Uploaded file: First line Second line Third line 源文件和上载的文件相应地具有不同的大小,非文本文件是相同的 代码: 如何修复此问题?编辑:由于

编辑:Filezilla导致了这个问题,当我从服务器下载文件时,它添加了新行。很抱歉搞混了


此方法将文件上载到ftp服务器,工作正常,但在上载到服务器的文本文件中,每行后面都会出现空行(“cr lf”出现),例如:

File: 
First line
Second line
Third line

Uploaded file:
First line

Second line

Third line
源文件和上载的文件相应地具有不同的大小,非文本文件是相同的

代码:


如何修复此问题?

编辑:由于下面的答案似乎没有帮助(但我将把它留给后代,因为它显示了更好的代码),下面是我要检查的诊断步骤:

  • 你是如何查看这些文件的?如果可能的话,直接进入服务器,而不是通过web浏览器或其他方式再次获取文件
  • 您要连接的FTP服务器的类型是什么?也许有一个已知的问题
  • 你有没有试过看看到底是通过什么发送的
  • 您是否尝试过通过普通FTP客户端发送相同的文件

您应该设置为true,以保留确切的文件内容。否则,这两个系统将尝试自行确定线端点,并根据需要更改线终止符。我很少认为这是个好主意。(编辑:
UseBinary
在默认情况下实际上是
true
,但这听起来像是使用文本模式引入的问题……将其明确化肯定没有坏处。)

此外:

  • 您应该使用语句通过
    处理
    文件流
  • 您应该使用语句通过
    处理请求流
  • 您应该注意
    流的结果。Read
    -它不必总是一次性读取所有请求的数据
  • 您可以使用
    File.ReadAllBytes
    一次性读取完整的文件数据,也可以使用
    Stream.CopyTo
    (如果您使用.NET 4)将
    FileStream
    复制到请求流(当然,这不会设置内容长度;我不知道这是否是个问题)
  • 您从未调用过
    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())
    {
    }
}

编辑:由于下面的答案似乎没有帮助(但我把它留给后代,因为它显示了更好的代码),下面是我要检查的诊断步骤:

  • 你是如何查看这些文件的?如果可能的话,直接进入服务器,而不是通过web浏览器或其他方式再次获取文件
  • 您要连接的FTP服务器的类型是什么?也许有一个已知的问题
  • 你有没有试过看看到底是通过什么发送的
  • 您是否尝试过通过普通FTP客户端发送相同的文件

您应该设置为true,以保留确切的文件内容。否则,这两个系统将尝试自行确定线端点,并根据需要更改线终止符。我很少认为这是个好主意。(编辑:
UseBinary
在默认情况下实际上是
true
,但这听起来像是使用文本模式引入的问题……将其明确化肯定没有坏处。)

此外:

  • 您应该使用语句通过
    处理
    文件流
  • 您应该使用语句通过
    处理请求流
  • 您应该注意
    流的结果。Read
    -它不必总是一次性读取所有请求的数据
  • 您可以使用
    File.ReadAllBytes
    一次性读取完整的文件数据,也可以使用
    Stream.CopyTo
    (如果您使用.NET 4)将
    FileStream
    复制到请求流(当然,这不会设置内容长度;我不知道这是否是个问题)
  • 您从未调用过
    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())
    {
    }
}

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


对于文本,截断LF或CR,查看发生了什么。我对不同的文件大小没有任何线索。

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


对于文本,截断LF或CR,查看发生了什么。我对不同的文件大小一无所知。

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

abcfile

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


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

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

abcfile

然后我将其设置为abcfile.dat,然后它将上传的文件显示为实际文件。我再次上传文件abcfile.txt,但这一次再次空行问题的应用程序
Transfer menu > Transfer type > binary