public void DoCheckFiles() { int count = 0; int oldFilePersent = -1; int oldTotalPersent = -1; foreach (ListFile file in _temp) { if (Status == Status.CANCEL) { GoEnd(WordEnum.CANCEL_BY_USER, true); return; } String path = CurrentProperty.Path; String fileName = path + file.FileName.Replace("/", "\\"); String zipFileName = fileName + ".zip"; FileInfo info = new FileInfo(fileName); FileInfo zipInfo = new FileInfo(zipFileName); MainForm.Instance.UpdateStatusLabel(WordEnum.CHECKING_S1, info.Name); try { if (!info.Exists && file.Type != ListFileType.DELETE) { goto DownloadFile; } if (FileUtils.IsFileOpen(info)) { GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, info.Name); return; } if (FileUtils.IsFileOpen(zipInfo)) { GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, zipInfo.Name); return; } if (file.Type != ListFileType.DELETE) { String checkSum = DTHasher.GetMD5Hash(fileName); if (!checkSum.Equals(file.md5Checksum)) //файл не совпадает { goto DownloadFile; } } else { goto DeleteFile; } goto UpdateLabel; } catch (Exception e) { _log.Info("Exception: " + e, e); if (file.Type != ListFileType.DELETE) { goto DownloadFile; } } //удаления файла DeleteFile: { if (info.Exists) { MainForm.Instance.UpdateStatusLabel(WordEnum.DELETE_S1, info.Name); info.Delete(); } goto UpdateLabel; } //загрузка файла DownloadFile: { Uri url = new Uri(CurrentProperty.listURL() + file.FileName + ".zip"); if (info.Directory != null) { if (!info.Directory.Exists) { info.Directory.Create(); } } try { MainForm.Instance.UpdateStatusLabel(WordEnum.DOWNLOADING_S1, info.Name); WebRequest request = WebRequest.Create(url); using (WebResponse response = request.GetResponse()) { int allSize = (int)response.ContentLength; int currentRead = 0; using (Stream remoteStream = response.GetResponseStream()) { using (Stream localStream = new FileStream(zipFileName, FileMode.Create, FileAccess.Write, FileShare.None)) { byte[] buffer = new byte[BUFFER_SIZE]; int readSize; while ((readSize = remoteStream.Read(buffer, 0, buffer.Length)) > 0) { if (Status == Status.CANCEL) { GoEnd(WordEnum.CANCEL_BY_USER, false); return; } localStream.Write(buffer, 0, readSize); currentRead += readSize; var persent = (int)((100F * currentRead) / allSize); if (persent != oldFilePersent) { oldFilePersent = persent; MainForm.Instance.UpdateProgressBar(persent, false); } } } } } UnpackFile(file); } catch (WebException e) { GoEnd(e.Message, true, true); return; } catch (Exception e) { if (_log.IsDebugEnabled) { _log.Debug("Exception: " + e.Message, e); } new ExceptionForm(e); GoEnd(null, true); return; } } //обновления главной формы UpdateLabel: { count++; int persent = (int)((100F * count) / _temp.Count); if (oldTotalPersent != persent) { oldTotalPersent = persent; MainForm.Instance.UpdateProgressBar(persent, true); } } //Thread.Sleep(SLEEP_TIME); } GoEnd(WordEnum.UPDATE_DONE, true); }
/// <summary> /// Прочитать информацию об аварии из бинарника вида AVR*.bin /// Переопределяет название аварии из бинарника /// Переопределяет время аварии /// Переопределяет FileHash /// Переопределяет BinFileInfo /// </summary> /// <param name="sourceFile">Путь к бинарнику</param> /// <returns>Результат операции</returns> public bool ReadInfoFromBinaryFile(FileInfo sourceFile) { //Log.Global.Info("Попытка чтения информации об аварии из файла: " + sourceFile.FullName); bool result = true; sourceFile.Refresh(); if (sourceFile.Exists) { //Log.Global.Info("Файл лога аварии существует"); using (var reader = new AdvancedBinaryReader(new FileStream(sourceFile.FullName, FileMode.Open, FileAccess.Read), false)) { long pagesCount = reader.BaseStream.Length / 2048; //Log.Global.Info("Количество страниц в файле = " + pagesCount); bool startPageFound = false; //int startPageIndex = 0; bool firstNonstartPageFound = false; for (long i = 0; i < pagesCount; ++i) { reader.BaseStream.Seek(i * 2048, SeekOrigin.Begin); byte firstPageByte = reader.ReadByte(); // считаем первый байт if (firstPageByte == 0x55) // заголовок найден! { //Log.Global.Info("Заголовочная страница найдена, её номер = " + i); startPageFound = true; HeaderPageIndex = i; // запомнить индекс страницы-заголовка аварии (но в реальности страниц может быть много!) // следующие 6 байт - дата (dd|MM|yy|HH|mm|ss) byte day = reader.ReadByte(); byte month = reader.ReadByte(); byte year = reader.ReadByte(); byte hour = reader.ReadByte(); byte minute = reader.ReadByte(); byte second = reader.ReadByte(); try { AccuredAt = new DateTime(2000 + year, month, day, hour, minute, second); // соберем байты в удобный вид } catch { //Log.Global.Info("Не удалось распарсить дату и время аварии из байт: " + year + " " + month + " " + day + " " + hour + " " + minute + " " + second); AccuredAt = DateTime.MinValue; } //Log.Global.Info("Дата аварии = " + AccuredAt.ToString("yyyy.MM.dd HH:mm:ss")); _faultNumberFromHeader = reader.ReadByte(); // прочитаем номер аварии (байт №8) _metersCount = reader.ReadByte(); // прочитаем число измерителей (байт №9) } else if (firstPageByte < 0x55) // Первую незаголовочную страницу нужно прочитать для получения настроек измерителя: { if (startPageFound) { firstNonstartPageFound = true; } //Log.Global.Info("Незаголовочная страница, её индекс=" + i + " RpdMeters.Count=" + RpdMeters.Count); reader.BaseStream.Seek(i * 2048, SeekOrigin.Begin); var pageRaw = new byte[2048]; reader.Read(pageRaw, 0, 2048); //считываем страницу var currentPage = new FaultArchivePage(pageRaw, this); // Считываем настройки всех измерителей: for (int j = 0; j < _metersCount; ++j) { var neededMeter = (RpdMeter)RpdMeters[j]; if (!neededMeter.SettingsReaded) { neededMeter.ReadSettings(currentPage); } } } if (startPageFound && firstNonstartPageFound) { break; } } if (startPageFound && firstNonstartPageFound) { //reader.BaseStream.Seek(startPageIndex * 2048, SeekOrigin.Begin); // После чтения информации по измерителям РПД необходимо вернуться в начало и прочитать текущие данные: var rpdCurrentData = new List <RpdChannelCurrentData>(); int rpdChannelCurrentDataOffset = 9; // В этом цикле считываем текущие данные каналов РПД, заодно на выходе получая позицию текущих данных ПСН for (int i = 0; i < _metersCount; ++i) { rpdChannelCurrentDataOffset += MeterHeaderCurrentDataRecordLength; foreach (RpdChannel ch in RpdMeters[i].Channels) { //Log.Global.Info("Channel=" + ch.Name + ".IsEnabled = " + ch.IsEnabled); if (ch.IsEnabled) { rpdChannelCurrentDataOffset += ChannelCurrentDataRecordLength; //Log.Global.Info("rpdChannelCurrentDataOffset = " + rpdChannelCurrentDataOffset); // Если настройки были прочитаны: // Нельзя выносить на верхний уровень, т.к. тогда не правильно отработает смещение rpdChannelCurrentDataOffset var neededMeter = (RpdMeter)RpdMeters[i]; if (neededMeter.Settings != null && neededMeter.SettingsReaded) { //Log.Global.Info(neededMeter.Name + " настроки были прочитаны"); reader.BaseStream.Seek(HeaderPageIndex * 2048 + rpdChannelCurrentDataOffset, SeekOrigin.Begin); var chT = neededMeter.Settings.Calibrations.Channels[ch.Number - 1]; var b1 = reader.ReadByte(); // По суте первый байт не нужен, но нужно сдвинуть текущее положение в файле на 1 байт var b2 = reader.ReadByte(); var b3 = reader.ReadByte(); //Log.Global.Info("b1 = " + b1); //Log.Global.Info("b2 = " + b2); //Log.Global.Info("b3 = " + b3); double channelCurrentValue = b2 + b3 * 256.0; //Log.Global.Info("ChCurrValue = " + channelCurrentValue); double modifiedCurValue = (channelCurrentValue - chT.Zero) * chT.Kkor * chT.Kper * 1.0; //Log.Global.Info("ResultValue = " + modifiedCurValue); rpdCurrentData.Add(new RpdChannelCurrentData(ch, modifiedCurValue)); } } } } int psnCurrentDataOffset = rpdChannelCurrentDataOffset; // На самом деле № позиции текущих данных ПСН определяется так: сумма числа разрешённых каналов рпд по каждому измерителю: //Log.Global.Info("Смещение текущих данных магистрали ПСН: psnCurrentDataOffset=" + psnCurrentDataOffset); var psnReasonRaw = new byte[FaultReason.PsnGaugesCount * FaultReason.PsnReplyMaxLength]; reader.BaseStream.Seek(HeaderPageIndex * 2048 + psnCurrentDataOffset, SeekOrigin.Begin); reader.Read(psnReasonRaw, 0, psnReasonRaw.Length); // TODO: whre to get PsnChannelSimple //Reason = new FaultReason(rpdCurrentData, PsnPagesParser.GetPsnCurrentData(psnReasonRaw, _deviceConfig)); reader.Close(); } else { reader.Close(); throw new Exception("Ошибка, не удалось найти начальную страницу или первую страницу с данными"); } //reader.Close(); FileHash = DTHasher.GetMD5Hash(sourceFile.FullName, string.Empty); BinFilePath = sourceFile; //this.Name = sourceFile.Name; // Имя исходного файла всегда корявое, UpdateName(); //Log.Global.Info("Информация об аварии {" + Name + "} успешно прочитана"); //Log.Global.Info(BinFilePath.FullName); //Log.Global.Info(Reason.ToString); } } else { result = false; //Log.Global.Info("Файл лога аварии не существует! result = " + result); } return(result); }
public void CheckNextFile() { if (Status == Status.CANCEL) { GoEnd(WordEnum.CANCEL_BY_USER, true); return; } ListFile file = FirstFile(); if (file == null) { GoEnd(WordEnum.UPDATE_DONE, true); return; } int currentCount = _maxSize - _temp.Count; var persent = (int)((100F * (currentCount)) / _maxSize); AssemblyPage.Instance().UpdateProgressBar(persent, true); string path = Directory.GetCurrentDirectory(); string fileName = path + file.FileName.Replace("/", "\\"); var info = new FileInfo(fileName); string word = LanguageHolder.Instance()[WordEnum.CHECKING_S1]; AssemblyPage.Instance().UpdateStatusLabel(String.Format(word, info.Name.Replace(".zip", "")), true); /* if (FileUtils.IsFileOpen(info)) * { * GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, info.Name.Replace(".zip", "")); * return; * }*/ String checkSum; try { checkSum = DTHasher.GetMD5Hash(fileName); } catch (Exception) { try { info.Delete(); } catch {} GoEnd(WordEnum.FILE_S1_IS_PROBLEMATIC_UPDATE_CANCEL_PLEASE_RECHECK, true, info.Name.Replace(".zip", "")); return; } if (checkSum == null) { GoEnd(WordEnum.PROBLEM_WITH_SERVER, true); return; } if (!info.Exists) { DownloadFile(file); //грузим } else if (!checkSum.Equals(file.md5Checksum)) //файл не совпадает { DownloadFile(file); //грузим } else { _temp.Remove(file); CheckNextFile(); //идем дальше } }