我正在尝试在几个站点之间传输文件,我正在使用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;
}
第一张图显示了源目录。 第二个图像显示目标目录。
我尝试在本地保存文件并获得相同的结果。
答案 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
。