Skip to main content
 首页 » 编程设计

c#之FtpWebRequest 没有下载超过 8820 字节的数据

2024年02月23日36TianFang

我正在尝试在几个站点之间传输文件,我正在使用 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; 
} 

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

我尝试将文件保存在本地并得到相同的结果。

请您参考如下方法:

你只调用一次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。