如何使用 FtpWebRequest 恢复损坏的 FTP 下载
How to recover a broken FTP download with FtpWebRequest
我们的系统工作的一些文件很大(>1GB)所以我需要从损坏的 FTP 下载中恢复。
如果我通过 FtpWebResponse 流进行搜索,我会收到一条错误消息,指出该流不支持此操作。
使用普通的 FtpWebResponse .net class?
有什么办法可以做到这一点
发现可以使用 ContentOffset
属性 of FtpWebRequest
来完成查找
这是一个工作示例:
public void deltaFtpTest()
{
byte[] dl(string url, int offset, int limit)
{
using (MemoryStream fs = new MemoryStream())
{
FtpWebRequest oFTP = (FtpWebRequest)FtpWebRequest.Create(url);
oFTP.Method = WebRequestMethods.Ftp.DownloadFile;
oFTP.UseBinary = true;
oFTP.UsePassive = true;
oFTP.Credentials = new NetworkCredential(@"...", "...");
int size = 0;
oFTP.ContentOffset = offset;
using (FtpWebResponse response = (FtpWebResponse)oFTP.GetResponse())
{
Stream responseStream = response.GetResponseStream();
byte[] buffer = new byte[2048];
int read = 0;
while (limit > 0)
{
read = responseStream.Read(buffer, 0, buffer.Length);
if (read > limit) read = limit; //if excedes limit, truncate
fs.Write(buffer, 0, read);
size += read;
limit -= read;
}
responseStream.Close();
response.Close();
return fs.ToArray();
}
}
}
var f = new StreamWriter(@"D:\temp\out.txt");
var bf = new BinaryWriter(f.BaseStream);
{
//getting the first 10 bytes in one session
bf.Write(dl("ftp://myserver/tmp/t1.txt", 0, 10));
//getting the rest of the bytes. The file as 60 bytes.
bf.Write(dl("ftp://myserver/tmp/t1.txt", 10, 50));
bf.Close();
}
}
我们的系统工作的一些文件很大(>1GB)所以我需要从损坏的 FTP 下载中恢复。
如果我通过 FtpWebResponse 流进行搜索,我会收到一条错误消息,指出该流不支持此操作。 使用普通的 FtpWebResponse .net class?
有什么办法可以做到这一点发现可以使用 ContentOffset
属性 of FtpWebRequest
这是一个工作示例:
public void deltaFtpTest()
{
byte[] dl(string url, int offset, int limit)
{
using (MemoryStream fs = new MemoryStream())
{
FtpWebRequest oFTP = (FtpWebRequest)FtpWebRequest.Create(url);
oFTP.Method = WebRequestMethods.Ftp.DownloadFile;
oFTP.UseBinary = true;
oFTP.UsePassive = true;
oFTP.Credentials = new NetworkCredential(@"...", "...");
int size = 0;
oFTP.ContentOffset = offset;
using (FtpWebResponse response = (FtpWebResponse)oFTP.GetResponse())
{
Stream responseStream = response.GetResponseStream();
byte[] buffer = new byte[2048];
int read = 0;
while (limit > 0)
{
read = responseStream.Read(buffer, 0, buffer.Length);
if (read > limit) read = limit; //if excedes limit, truncate
fs.Write(buffer, 0, read);
size += read;
limit -= read;
}
responseStream.Close();
response.Close();
return fs.ToArray();
}
}
}
var f = new StreamWriter(@"D:\temp\out.txt");
var bf = new BinaryWriter(f.BaseStream);
{
//getting the first 10 bytes in one session
bf.Write(dl("ftp://myserver/tmp/t1.txt", 0, 10));
//getting the rest of the bytes. The file as 60 bytes.
bf.Write(dl("ftp://myserver/tmp/t1.txt", 10, 50));
bf.Close();
}
}