FtpWebRequest不下载超过8820字节的数据

时间:2011-10-17 06:38:35

标签: c# ftp

我正在尝试在几个站点之间传输文件,我正在使用FtpWebRequest从站点A下载文件并将其上传到站点B.

我面临的问题是当我下载文件时,我没有得到超过8820字节的数据。

继承我正在使用的代码:

public FtpFile Download(string path)
{
  string fullpath = ConstructFullpath(path);

  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fullpath);
  request.Method = WebRequestMethods.Ftp.DownloadFile;
  // login
  request.Credentials = new NetworkCredential(Username, Password);  

  FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  Stream responseStream = request.GetResponse().GetResponseStream();

  byte[] data = new byte[20000];
  int length = responseStream.Read(data, 0, data.Length);
  responseStream.Close();

  FtpFile file = new FtpFile(path, data, length);
  return file;
}

public bool Upload(FtpFile file)
{
  if (!DirectoryExists(GetDirectory(file.Path)))
  {
    CreateDirectory(GetDirectory(file.Path));
  }

  string fullpath = ConstructFullpath(file.Path);
  FtpWebRequest request = (FtpWebRequest)WebRequest.Create(fullpath);
  request.Method = WebRequestMethods.Ftp.UploadFile;
  request.Credentials = new NetworkCredential(Username, Password);


  Stream stream = request.GetRequestStream();
  stream.Write(file.Data, 0, file.Length);
  stream.Close();

  FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  return true;
}

第一张图显示了源目录。 第二个图像显示目标目录。

The source web directory

The destination web directory 我尝试在本地保存文件并获得相同的结果。

1 个答案:

答案 0 :(得分:4)

您只需拨打Read一次:

byte[] data = new byte[20000];
int length = responseStream.Read(data, 0, data.Length);
responseStream.Close();

无法保证所有数据都会在一次通话中被读取,您绝不应该依赖它。你应循环(例如将数据复制到MemoryStream),直到Read返回0。

如果您使用的是.NET 4,Stream.CopyTo可以轻松实现:

MemoryStream ms = new MemoryStream();
responseStream.CopyTo(ms);

请注意,您还应该使用using语句,而不是明确关闭资源,其中包括FtpWebResponse