Редактировать: Это сделано в Compact Framework, у меня нет доступа к WebClient, поэтому это должно быть сделано с помощью HttpWebRequests.
Я создаю приложение менеджера загрузок, которое будет иметь возможность одновременных загрузок (более одной загрузки одновременно) и возможность сообщать о проценте выполненных операций и возобновлять загрузки.
Это означает, что я загружаю несколько байтов в буфер, а затем записываю буфер на диск. Я просто хотел проверить, какой алгоритм / процедура рекомендуется для этого.
Это то, что я пока имею для основного метода загрузки:
private void StartDownload()
{
HttpWebRequest webReq = null;
HttpWebResponse webRes = null;
Stream fileBytes = null;
FileStream saveStream = null;
try
{
webReq = (HttpWebRequest)HttpWebRequest.Create(_url);
webReq.Headers.Add(HttpRequestHeader.Cookie, "somedata");
webRes = (HttpWebResponse)webReq.GetResponse();
byte[] buffer = new byte[4096];
long bytesRead = 0;
long contentLength = webRes.ContentLength;
if (File.Exists(_filePath))
{
bytesRead = new FileInfo(_filePath).Length;
}
fileBytes = webRes.GetResponseStream();
fileBytes.Seek(bytesRead, SeekOrigin.Begin);
saveStream = new FileStream(_filePath, FileMode.Append, FileAccess.Write);
while (bytesRead < contentLength)
{
int read = fileBytes.Read(buffer, 0, 4096);
saveStream.Write(buffer, 0, read);
bytesRead += read;
}
//set download status to complete
//_parent
}
catch
{
if (Thread.CurrentThread.ThreadState != ThreadState.AbortRequested)
{
//Set status to error.
}
}
finally
{
saveStream.Close();
fileBytes.Close();
webRes.Close();
saveStream.Dispose();
fileBytes.Dispose();
saveStream = null;
fileBytes = null;
webRes = null;
webReq = null;
}
}
Должен ли я загружать больший буфер? Должен ли я записывать буфер в файл так часто (каждые 4 КБ?) Должен ли там быть какой-то спящий поток, чтобы гарантировать, что не весь процессор используется? Я думаю, что сообщать об изменении прогресса каждые 4 КБ - это глупо, поэтому я планировал делать это через каждые 64 КБ.
Нужны общие советы или что-то не так с моим кодом.