/// <summary> /// Получить диагностический отчет /// </summary> /// <param name="reportItems">Элементы отчета</param> public IFileSystemItem GetDiagnosticReport(DiagnosticReportItems reportItems) { // формируем имя временного фала отчета String repFileName = String.Format("{0}\\report-{1}-{2}.cab", PathHelper.ExecutablePath, Settings.Common.PointId, Settings.Common.CashNo); // создаем объект для упаковки отчета using (CabCompressor cabComp = new CabCompressor()) { // инициализируем упаковщик cabComp.CabInfo.MaxCabinetSize = Int32.MaxValue; cabComp.CabInfo.MaxFolderSize = Int32.MaxValue; cabComp.CabInfo.CabPath = Path.GetDirectoryName(repFileName) + "\\"; cabComp.CabInfo.CabName = Path.GetFileName(repFileName); cabComp.UserData = new Object(); // добавляем копоненты отчета // база данных if ((reportItems & DiagnosticReportItems.Database) == DiagnosticReportItems.Database) AddToCabinet(cabComp, Settings.Database.DatabaseFile, false, null); // логи if ((reportItems & DiagnosticReportItems.Logs) == DiagnosticReportItems.Logs) { // логи кассовой системы String[] files = Directory.GetFiles(PathHelper.StorageFolder, "*.log"); foreach (String fileName in files) { AddToCabinet(cabComp, fileName, false, "logs"); } // лог клиента POS Mail String posmailLog = String.Format("{0}\\Почтовый сервер POS Mail\\Client\\POSMailClient.log", Environment.GetEnvironmentVariable("ProgramFiles")); if (File.Exists(posmailLog)) AddToCabinet(cabComp, posmailLog, false, "posmail"); } // дамп драйвера ФР if ((reportItems & DiagnosticReportItems.FiscalDump) == DiagnosticReportItems.FiscalDump) AddToCabinet(cabComp, "c:\\fiscal.dmp", false, null); // отчет о версиях файлов if ((reportItems & DiagnosticReportItems.FileVersions) == DiagnosticReportItems.FileVersions) AddVersionInfoToCabinet(cabComp); // конфигурация системы if ((reportItems & DiagnosticReportItems.Settings) == DiagnosticReportItems.Settings) AddToCabinet(cabComp, PathHelper.SettingsFile, false, null); // сохраняем архив cabComp.FlushCabinet(); } // возвращаем ссылку на элемент файловой системы отчета return FileSystemItem.GetRoot(repFileName, null); }
/// <summary> /// Добавляет файл в архив /// </summary> /// <param name="cabComp">Компрессор</param> /// <param name="fileName">Имя файла</param> /// <param name="isTemporary">Является ли файл временным</param> /// <param name="folderInCab">Папка в архиве</param> private void AddToCabinet(CabCompressor cabComp, String fileName, Boolean isTemporary, String folderInCab) { if (File.Exists(fileName)) { try { // имя файла в архиве String nameInCab = isTemporary ? Path.GetFileNameWithoutExtension(fileName) : Path.GetFileName(fileName); // полное имя файла в архиве String fullNameInCab = String.IsNullOrEmpty(folderInCab) ? nameInCab : String.Format("{0}\\{1}", folderInCab, nameInCab); // пытаемся добавить файл в архив cabComp.AddFile(fileName, fullNameInCab, false, FciCompression.MsZip); } catch (ApplicationException) { // проверяем, не является ли файл временным if (isTemporary) // файл является временным // повторная генерация исключения throw; else AddTemporaryToCabinet(cabComp, fileName, folderInCab); } } }
/// <summary> /// Добавляет сводный отчет о версиях файлов в архив /// </summary> /// <param name="cabComp">Компрессор</param> private void AddVersionInfoToCabinet(CabCompressor cabComp) { // формируем имя отчета String vInfoReportName = String.Format("{0}\\version.txt", PathHelper.ExecutablePath); try { // открываем файл отчета using (StreamWriter sw = new StreamWriter(vInfoReportName, false, Encoding.Default)) { sw.WriteLine("Папка установки \"Форинт-К\""); AddTreeToFile(sw, CashsystemRoot, true); sw.WriteLine(String.Empty); sw.WriteLine(String.Empty); sw.WriteLine("Системная папка ОС"); AddTreeToFile(sw, BplRoot, false); } // добавляем отчет в архив AddToCabinet(cabComp, vInfoReportName, false, null); } finally { // проверяем существование отчета о версиях файлов if (File.Exists(vInfoReportName)) // удаляем отчет File.Delete(vInfoReportName); } }
/// <summary> /// Добавляет в архив временный файл /// </summary> /// <param name="cabComp">Компрессор</param> /// <param name="fileName">Имя оригинального файла</param> /// <param name="folderInCab">Папка в архиве</param> private void AddTemporaryToCabinet(CabCompressor cabComp, String fileName, String folderInCab) { // файл открыт другим приложением // формируем имя временного файла String tmpFileName = String.Format("{0}.tmp", fileName); try { // открываем временный файл using (FileStream fs = new FileStream(tmpFileName, FileMode.Create, FileAccess.Write, FileShare.None)) { // открываем исходный файл using (Stream source = GetFile(fileName)) { // копируем из файла-источника во временный файл Byte[] swap = new Byte[_swapSize]; Int32 bytesRead; while (source.Position < source.Length) { bytesRead = source.Read(swap, 0, _swapSize); if (bytesRead > 0) fs.Write(swap, 0, bytesRead); } } } // добавляем в архив временный файл AddToCabinet(cabComp, tmpFileName, true, folderInCab); } finally { // если временный файл существует if (File.Exists(tmpFileName)) // удаляем его File.Delete(tmpFileName); } }