如何使用自动恢复工具下载ftp文件

时间:2011-06-13 13:33:15

标签: c#

我有一个问题,问题是我可以下载ftp文件,但我下载的文件没有恢复设施和多部分文件下载,因为有超过500 MB文件的大文件我不能连续下载文件,因为我断开连接并从头开始下载我希望我的代码恢复设施如果它断开连接

我正在使用的代码是

    public string[] GetFileList()
    {
        string[] downloadFiles;
        StringBuilder result = new StringBuilder();
        FtpWebRequest reqFTP;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/"));
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
            WebResponse response = reqFTP.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            //MessageBox.Show(reader.ReadToEnd());
            string line = reader.ReadLine();
            while (line != null)
            {
                result.Append(line);
                result.Append("\n");
                line = reader.ReadLine();
            }
            result.Remove(result.ToString().LastIndexOf('\n'), 1);
            reader.Close();
            response.Close();
            //MessageBox.Show(response.StatusDescription);
            return result.ToString().Split('\n');
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            downloadFiles = null;
            return downloadFiles;
        }
    }


    private void Download(string filePath, string fileName)
    {
        FtpWebRequest reqFTP;
        try
        {
            //filePath = <<The full path where the file is to be created.>>, 
            //fileName = <<Name of the file to be created(Need not be the name of the file on FTP server).>>
            FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);

            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
            FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();
            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];

            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

private void btnDownload_Click(object sender,EventArgs e)         {

        FolderBrowserDialog fldDlg = new FolderBrowserDialog();
        if (txtUpload.Text.Trim().Length > 0)
        {
            if (fldDlg.ShowDialog() == DialogResult.OK)
            {
                Download(fldDlg.SelectedPath, txtUpload.Text.Trim());
            }
        }
        else
        {
            MessageBox.Show("Please enter the File name to download");
        }
    }

我想在我的代码中使用简历设施,

如果有人可以帮助我,我们将非常感激,

提前致谢

2 个答案:

答案 0 :(得分:6)

在开始下载之前检查本地文件系统上是否存在该文件。如果存在,则获取大小并将其用于FtpWebRequest对象的ContentOffset成员。但是,FTP服务器可能不支持此功能。

答案 1 :(得分:0)

使用 FtpWebRequest 的 FTP 下载恢复的本机实现:

bool resume = false;
do
{
    try
    {
        FileMode mode = resume ? FileMode.Append : FileMode.Create;
        resume = false;
        using (Stream fileStream = File.Open(@"C:\local\path\file.dat", mode))
        {
            var url = "ftp://ftp.example.com/remote/path/file.dat";
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
            request.Credentials = new NetworkCredential("username", "password");
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.ContentOffset = fileStream.Position;
            using (Stream ftpStream = request.GetResponse().GetResponseStream())
            {
                ftpStream.CopyTo(fileStream);
            }
        }
    }
    catch (WebException)
    {
        resume = true;
    }
}
while (resume);

或者使用可以自动恢复传输的 FTP 库。

例如 WinSCP .NET assembly 可以。有了它,可恢复下载就像:

// Setup session options
var sessionOptions = new WinSCP.SessionOptions
{
    Protocol = Protocol.Ftp,
    HostName = "ftp.example.com",
    UserName = "user",
    Password = "mypassword"
};

using (var session = new Session())
{
    // Connect
    session.Open(sessionOptions);

    // Resumable download
    session.GetFileToDirectory("/home/user/file.zip", @"C:\path");
}

(我是 WinSCP 的作者)