RestSharp 下载数据与进度条同步
RestSharp DownloadData sync with progressbar
如何在 window 表单应用程序中下载文件并通过 ProgressBar 显示下载进度?
RestClient client = new RestClient("http://127.0.0.1/");
RestRequest request = new RestRequest("/test/{FileName}");
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);
string path = @"C:/Users/[user]/Desktop/testFile.abc";
var fileForDownload = client.DownloadData(request);
fileForDownload.SaveAs(path);
if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
{
MessageBox.Show("done");
}
我写了一些这样的想法,但我不知道现在是什么?
抱歉,你不能,因为 RestClient 中没有事件处理程序对象来获取下载数据的状态。
这是另一种方法;
//...
timer1.Interval = 1000; // 1 sec interval.
timer1.Start();
RestClient client = new RestClient("http://127.0.0.1/")
{
Timeout = 10 * 1000 //10 sec timeout time.
};
RestRequest request = new RestRequest("/test/{FileName}");
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);
string path = @"C:/Users/[user]/Desktop/testFile.abc";
var fileForDownload = client.DownloadData(request);
fileForDownload.SaveAs(path);
if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
{
MessageBox.Show("done");
}
progressBar1.Value = 100;
timer1.Stop();
}
public void timer1_Tick(object sender, EventArgs e)
{
if (progressBar1.Value <= 100)
{
progressBar1.Value += 10;
}
if (progressBar1.Value >= 100)
{
progressBar1.Value = 0;
}
}
为命名最佳实践更改 "timer1" 的名称。祝你好运...
我认为更好的替代方法是覆盖 FileStream 以获取写入文件的字节数:
string tempFile = Path.Combine(Configuration.DownloadFolder, "TEST.DATA");
using (var writer = new HikFileStream(tempFile))
{
writer.Progress += (w, e) => {
#if DEBUG
Console.Write(string.Format("\rProgress: {0} / {1:P2}", writer.CurrentSize, ((double)writer.CurrentSize) / finalFileSize));
#endif
};
request.ResponseWriter = (responseStream) => responseStream.CopyTo(writer);
var response = client.DownloadData(request);
}
HikFileStream 所在位置:
class HikFileStream : FileStream
{
public HikFileStream(string path)
: base(path, FileMode.Create, FileAccess.Write, FileShare.None)
{
}
public long CurrentSize { get; private set; }
public event EventHandler Progress;
public override void Write(byte[] array, int offset, int count)
{
base.Write(array, offset, count);
CurrentSize += count;
var h = Progress;
if (h != null)
h(this, EventArgs.Empty);//WARN: THIS SHOULD RETURNS ASAP!
}
}
如何在 window 表单应用程序中下载文件并通过 ProgressBar 显示下载进度?
RestClient client = new RestClient("http://127.0.0.1/");
RestRequest request = new RestRequest("/test/{FileName}");
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);
string path = @"C:/Users/[user]/Desktop/testFile.abc";
var fileForDownload = client.DownloadData(request);
fileForDownload.SaveAs(path);
if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
{
MessageBox.Show("done");
}
我写了一些这样的想法,但我不知道现在是什么?
抱歉,你不能,因为 RestClient 中没有事件处理程序对象来获取下载数据的状态。
这是另一种方法;
//...
timer1.Interval = 1000; // 1 sec interval.
timer1.Start();
RestClient client = new RestClient("http://127.0.0.1/")
{
Timeout = 10 * 1000 //10 sec timeout time.
};
RestRequest request = new RestRequest("/test/{FileName}");
request.AddParameter("FileName", "testFile.abc", ParameterType.UrlSegment);
string path = @"C:/Users/[user]/Desktop/testFile.abc";
var fileForDownload = client.DownloadData(request);
fileForDownload.SaveAs(path);
if (File.Exists(@"C:/Users/[user]/Desktop/testFile.abc"))
{
MessageBox.Show("done");
}
progressBar1.Value = 100;
timer1.Stop();
}
public void timer1_Tick(object sender, EventArgs e)
{
if (progressBar1.Value <= 100)
{
progressBar1.Value += 10;
}
if (progressBar1.Value >= 100)
{
progressBar1.Value = 0;
}
}
为命名最佳实践更改 "timer1" 的名称。祝你好运...
我认为更好的替代方法是覆盖 FileStream 以获取写入文件的字节数:
string tempFile = Path.Combine(Configuration.DownloadFolder, "TEST.DATA");
using (var writer = new HikFileStream(tempFile))
{
writer.Progress += (w, e) => {
#if DEBUG
Console.Write(string.Format("\rProgress: {0} / {1:P2}", writer.CurrentSize, ((double)writer.CurrentSize) / finalFileSize));
#endif
};
request.ResponseWriter = (responseStream) => responseStream.CopyTo(writer);
var response = client.DownloadData(request);
}
HikFileStream 所在位置:
class HikFileStream : FileStream
{
public HikFileStream(string path)
: base(path, FileMode.Create, FileAccess.Write, FileShare.None)
{
}
public long CurrentSize { get; private set; }
public event EventHandler Progress;
public override void Write(byte[] array, int offset, int count)
{
base.Write(array, offset, count);
CurrentSize += count;
var h = Progress;
if (h != null)
h(this, EventArgs.Empty);//WARN: THIS SHOULD RETURNS ASAP!
}
}