【问题标题】:How to recover a broken FTP download with FtpWebRequest [duplicate]如何使用 FtpWebRequest 恢复损坏的 FTP 下载 [重复]
【发布时间】:2018-04-20 16:14:10
【问题描述】:

我们系统工作的一些文件很大(>1GB),所以我需要从损坏的 FTP 下载中恢复。

如果我通过 FtpWebResponse 流进行搜索,我会收到一条错误消息,指出该流不支持此功能。 有什么方法可以使用普通的 FtpWebResponse .net 类来实现这一点?

【问题讨论】:

    标签: c# ftp ftpwebrequest ftpwebresponse


    【解决方案1】:

    发现可以使用FtpWebRequestContentOffset属性来完成查找

    这是一个工作示例:

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

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2014-04-29
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多