private async Task <IList <T> > CheckAndLoadFromCacheAsync <T>(string fileName, Model.WorkTask workTask) { FileInfo fileInfo = new System.IO.FileInfo(fileName); List <T> data = null; string cachedFileName = this.GetDbTableNamePath(fileName); if (this.dataFilesInfo.ContainsKey(fileName)) { workTask.UpdateStatus($"загрузка данных из кэша ..."); workTask.IsIndeterminate = true; DataFileRecord info = this.dataFilesInfo[fileName]; if (info.LastModified == fileInfo.LastWriteTime) { T[] result = await this.DeserializeDataAsync <T>(cachedFileName); if (result != null) { data = new List <T>(result); } } else { // расчет хэша файла и сравнение с ранее сохраненным string hashAsString = this.CalculateSHA256(fileName); if (string.Equals(info.Hash, hashAsString)) { T[] result = await this.DeserializeDataAsync <T>(cachedFileName); if (result != null) { data = new List <T>(result); } } else { ; } } } else { ; } return(data); }
private void StoreHashAndSaveData <T>(FileInfo fileInfo, WorkTask workTask, T[] data) { string fileName = fileInfo.FullName; string msg = "вычисление контрольной-суммы файла ..."; workTask.UpdateStatus(msg); workTask.IsIndeterminate = true; string hashAsString = string.Empty; bool isOk = false; byte numberOfRetries = 1; do { try { hashAsString = this.CalculateSHA256(fileName); isOk = true; } catch (IOException ex) { this.callBackAction(ex); workTask.UpdateStatus(string.Format("{0}\nфайл используется другим процессом, попытка #{1}", msg, numberOfRetries)); Task.Delay(1_000); } numberOfRetries++; } while (isOk == false); DataFileRecord dataFileRecord = new DataFileRecord(fileName, hashAsString, fileInfo.LastWriteTime); if (this.dataFilesInfo.ContainsKey(fileName)) { this.dataFilesInfo[fileName] = dataFileRecord; } else { this.dataFilesInfo.Add(fileName, dataFileRecord); } string cachedFileName = this.GetDbTableNamePath(fileName); _ = this.SerializeDataAsync <T>(data, cachedFileName); }