2011-08-07 19 views
0

编辑: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(); 
} 

我怎样才能解决这个问题?

+1

不相关的,但你应该真正包装你的流'使用'块,以确保他们妥善处置。 –

回答

2

编辑:由于下面的答案似乎并没有帮助的(但我要离开它有供后人它显示了更好的代码)这里是下一步骤诊断我检查:

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

您应该设置FtpWebRequest.UseBinary为true,以保持准确的文件内容。否则,这两个系统将尝试自行找出行结束符,并根据需要更改行结束符。我很少认为这是一个好主意。 (编辑:UseBinary实际上是true默认,但这个听起来像使用文本模式推出的问题那种 ...它的确没有伤害到更加明确。)

此外:

  • 你应该通过using语句处置您的FileStream
  • 你应该通过using声明
  • 你应该考虑结果的音符被处置的请求流的Stream.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()) 
    { 
    } 
} 
+0

这是我首先想到的,但我在文档中注意到默认值已经是true。 –

+0

@Joe:嗯......你说得对。我会亲自将其设置为True,以确定它是否有所作为......但是OP代码中还有其他问题,可能值得使用我的答案中显示的新版本,然后检查结果。当然有可能是OP的FTP服务器坏了... –

+0

@Jon Skeet:使用你的代码,但问题依然存在。也谢谢你纠正! – Anatoly

1

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

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

+0

(或者只是使用二进制模式。你的偏好:)) –

2

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

abcfile

然后我让abcfile.dat之后,它显示我上传的文件作为实际的文件。我再次上​​传文件与abcfile.txt但这次又空行问题出现在我上传的文件。

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