Использую библиотеку 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);
}
}
Только, если файл существует(и хеш совпадает), должен скачаться следующий файл, но загрузка стоит на месте. Файлы скачиваются только, если нет совпадений
Подскажите, пожалуйста, как это решить ?
Не знаю, на сколько это верно, но это работает
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;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нашел такой пример, но для работы данного кода надо добавить ссылку на using ADSSECURITYLib, но нигде я не нашел где взять эту ссылкуADsSecurity
Как узнать параметр vmpath в VMware для операции клонирования? https://codevmware
Недавно начал изучать это адский комбайн и уткнулся в то, что, при компиляции кода, если студии что-то не нравится, код просто не будет скомпилированВ...