C# 传输文本文件后,其中会出现空行
编辑:Filezilla导致了这个问题,当我从服务器下载文件时,它添加了新行。很抱歉搞混了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 源文件和上载的文件相应地具有不同的大小,非文本文件是相同的 代码: 如何修复此问题?编辑:由于
此方法将文件上载到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
(如果您使用.NET 4)将Stream.CopyTo
复制到请求流(当然,这不会设置内容长度;我不知道这是否是个问题)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
(如果您使用.NET 4)将Stream.CopyTo
复制到请求流(当然,这不会设置内容长度;我不知道这是否是个问题)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