FTP下载后台工作者

时间:2014-01-20 11:39:42

标签: c# ftp

我有这段代码,但它不起作用......

进度条没有移动,下载的文件大小为0kb。

我想我的WHILE循环中有一些问题!我怎么解决这个问题?请给我指示!

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
  DirectoryInfo folder= new DirectoryInfo(@"C:\Cloud24");
  try
  {
    {
      long size= 0;
      WebClient request = new WebClient();
      request.Credentials = new NetworkCredential(userid, userpass);
      FileStream file = File.Create(folder+ "//" + downloadname);
      byte[] filedata = request.DownloadData(ftpadress + "/" + downloadname);
      while ((size= file.Read(filedata, 0, filedata.Length)) > 0) 
      {
        file.Write(filedata, 0, filedata.Length);
        size += (int)filedata.Length;
        double dProgressPercentage = ((double)(size) / (double)filedata.Length);
        backgroundWorker1.ReportProgress((int)(dProgressPercentage * 100));
      }
      file.Close();
      MessageBox.Show(downloadname + " downloaded!" + 
                      Environment.NewLine + "There: " + folder);
    }
  }
  catch (Exception exc)
  {
    MessageBox.Show("Error: " + exc.Message);
  }
}

1 个答案:

答案 0 :(得分:0)

这应该可行,但我实际上没有测试过它。

    private async void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        var folder = new DirectoryInfo(@"C:\Cloud24");
        try
        {
            {
                var manualResetEvent = new ManualResetEventSlim();
                var client = new WebClient { Credentials = new NetworkCredential(userid, userpass) };
                client.DownloadProgressChanged += (o, args) => backgroundWorker1.ReportProgress(args.ProgressPercentage);
                client.DownloadDataCompleted += (o, args) => manualResetEvent.Set();
                var filedata = client.DownloadDataAsync(ftpadress + "/" + downloadname);
                manualResetEvent.Wait();
                using (var stream = File.Create(folder + "//" + downloadname))
                {
                    await stream.WriteAsync(filedata, 0, filedata.Length);
                }
                MessageBox.Show(downloadname + " downloaded!" + Environment.NewLine + "There: " + folder);
            }
        }
        catch (Exception exc)
        {
            MessageBox.Show("Error: " + exc.Message);
        }
    }