Скачивание файла с проверкой наличия и хеша

266
26 декабря 2017, 14:13

Использую библиотеку CefSharp. Столкнулась с проблемой обновления файлов

Передаю список файлов в очередь, которая задействует метод NextFile()

private Queue<UpdateItem> _queuee;
public void Load(UpdateItem[] updList)
{
    if (_queuee != null)
    {
        foreach (UpdateItem item in updList)
        {
            _queuee.Enqueue(item);
            _downloadContext.TotalBytes += item.fileLenth;
            _downloadContext.FileHash = item.fileHash;
            _downloadContext.Folder = item.folderName;
            _downloadContext.FileName = item.itemName;
        }
    }
    else
    {
        _queuee = new Queue<UpdateItem>(updList);
        for (int i = 0; i < updList.Length; i++)
        {
            _downloadContext.TotalBytes += updList[i].fileLenth;
            _downloadContext.FileHash = updList[i].fileHash;
            _downloadContext.Folder = updList[i].folderName;
            _downloadContext.FileName = updList[i].itemName;
        }
    }
    NextFile();
}
private void NextFile()
{
    var handler = new TestDownloadHandler(Browser, bar, _downloadContext);
    handler.DownloadingCompleted += Handler_DownloadingCompleted;
    Browser.DownloadHandler = handler;

    if (_queuee.Count > 0)
    {
        var item = _queuee.Dequeue();
        //   Browser.Load(item.fileName);
        var downFolder = Path.Combine(_xmlhelper.GetSettingValue("realm1_client_location") + _downloadContext.Folder + _downloadContext.FileName);
        if (!File.Exists(downFolder))
        {
            Browser.Load(item.fileName);
        }
        else
        {
            if (HashHelper.GetMD5HashOfFile(downFolder) != _downloadContext.FileHash)
            {
                File.Delete(downFolder);
                Browser.Load(item.fileName);
            }
        }

    }
    else
    {
        _downloadContext.Reset();
        Browser.ExecuteScriptAsync("updateComplete();");
    }
}
private void Handler_DownloadingCompleted(object sender, EventArgs e)
{
    var prevHandler = (TestDownloadHandler)sender;
    prevHandler.DownloadingCompleted -= Handler_DownloadingCompleted;
    NextFile();
}
public class TestDownloadHandler : IDownloadHandler
{
    private readonly IWpfWebBrowser _wpfBrowser;
    private readonly ProgressBar _bar;
    private readonly DownloadContext _downloadContext;
    public TestDownloadHandler(IWpfWebBrowser wpfBrowser, ProgressBar bar, DownloadContext downloadContext)
    {
        _bar = bar;
        _wpfBrowser = wpfBrowser;
        _downloadContext = downloadContext;
    }
    public event EventHandler DownloadingCompleted;
    public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
    {
        if (!callback.IsDisposed)
        {
            using (callback)
            {
                var downFolder = Path.Combine(_xmlhelper.GetSettingValue("realm1_client_location") + _downloadContext.Folder + downloadItem.SuggestedFileName);
                callback.Continue(downFolder, false);
                _wpfBrowser.ExecuteScriptAsync("document.getElementById('status').textContent='Loading file: " + downloadItem.SuggestedFileName + "'");
            }
        }
    }
    public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
    {
        if (downloadItem.IsCancelled)
        {
            _bar.Dispatcher.Invoke(() => { _bar.Value = _bar.Minimum; });
            return;
        }
        double total = _downloadContext.TotalBytes;
        double bytesIn = downloadItem.ReceivedBytes + _downloadContext.ReceivedBytes;
        double percentage = bytesIn / total * 100;
        double totalPercent = Math.Truncate(percentage);
        if (downloadItem.IsComplete)
        {
            _downloadContext.ReceivedBytes += downloadItem.TotalBytes;
            OnDownloadingCompleted();
            return;
        }
        _bar.Dispatcher.Invoke(() => { _bar.Value = totalPercent; });
        string script = "document.getElementById('progress').style.width='" + totalPercent + "%'";
        _wpfBrowser.ExecuteScriptAsync(script);
    }
    protected virtual void OnDownloadingCompleted()
    {
        DownloadingCompleted?.Invoke(this, EventArgs.Empty);
    }
}   

Моя логика такая - если файла не существует, скачать, иначе сравнить хеш и, в случае несовпадения, удалить старый и скачать новый

var downFolder = Path.Combine(_xmlhelper.GetSettingValue("realm1_client_location") + _downloadContext.Folder + _downloadContext.FileName);
if (!File.Exists(downFolder))
{
    Browser.Load(item.fileName);
}
else
{
    if (HashHelper.GetMD5HashOfFile(downFolder) != _downloadContext.FileHash)
    {
        File.Delete(downFolder);
        Browser.Load(item.fileName);
    }
}

Только, если файл существует(и хеш совпадает), должен скачаться следующий файл, но загрузка стоит на месте. Файлы скачиваются только, если нет совпадений

Подскажите, пожалуйста, как это решить ?

Answer 1

Не знаю, на сколько это верно, но это работает

public void Load(UpdateItem[] updList) 
{ 
if (_queuee != null){ 
foreach (UpdateItem item in updList){ 
_queuee.Enqueue(item); 
_downloadContext.TotalBytes += item.fileLenth; 
_downloadContext.FileHash = item.fileHash; 
_downloadContext.Folder = item.folderName; 
_downloadContext.FileName = item.itemName; 
} 
} 
else{ 
_queuee = new Queue<UpdateItem>(updList); 
for (int i = 0; i < updList.Length; i++) 
{ 
_downloadContext.TotalBytes += updList[i].fileLenth; 
_downloadContext.FileHash = updList[i].fileHash; 
_downloadContext.Folder = updList[i].folderName; 
_downloadContext.FileName = updList[i].itemName; 
} 
} 
READ ALSO
Программно задать разрешения на папку [требует правки]

Программно задать разрешения на папку [требует правки]

Нашел такой пример, но для работы данного кода надо добавить ссылку на using ADSSECURITYLib, но нигде я не нашел где взять эту ссылкуADsSecurity

221
Параметр vmpath в VMware

Параметр vmpath в VMware

Как узнать параметр vmpath в VMware для операции клонирования? https://codevmware

161
C# Xamarin Forms в Visual Studio, компиляция

C# Xamarin Forms в Visual Studio, компиляция

Недавно начал изучать это адский комбайн и уткнулся в то, что, при компиляции кода, если студии что-то не нравится, код просто не будет скомпилированВ...

220