GetHrzWpf/MainWindow.xaml.cs
2025-12-29 09:37:22 +05:00

181 lines
6.1 KiB
C#

using Microsoft.Win32;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using GetHrzLib.Models;
namespace GetHrzWPF
{
public partial class MainWindow : Window
{
private string _currentFilePath;
/// <summary>
/// 213
/// </summary>
public MainWindow()
{
InitializeComponent();
}
private void OnOpenClickimg(object sender, RoutedEventArgs e)
{
var dlg = new OpenFileDialog
{
Title = "Выбери файл .img",
Filter = "IMG files (*.img)|*.img|All files (*.*)|*.*",
Multiselect = false,
CheckFileExists = true
};
if (dlg.ShowDialog(this) == true)
{
// InfoLabel.Content = dlg.FileName;
// LogBox.AppendText($"Открыт образ: {dlg.FileName}{Environment.NewLine}");
// LogBox.ScrollToEnd();
}
string filePath = dlg.FileName;
try
{
using var writer = new StringWriter();
BlockProcessor.Process(writer, filePath);
_currentFilePath = filePath;
InfoLabel.Content = filePath;
LogBox.Text = writer.ToString();
LogBox.ScrollToEnd();
}
catch (Exception ex)
{
LogBox.Text = $"Ошибка: {ex.Message}";
}
}
private async void OnOpenClickdisk(object sender, RoutedEventArgs e)
{
// 1) Берём список USB через вашу библиотеку
var usbDrives = UsbDriveService.GetUsbDrivesSafe();
if (usbDrives.Count == 0)
{
MessageBox.Show(this, "Съёмные USB-диски не найдены.", "USB",
MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
// 2) Окно выбора диска (как вы уже делали)
var dlg = new SelectUsbWindow(usbDrives) { Owner = this };
if (dlg.ShowDialog() != true || dlg.SelectedDrive == null)
return;
// 3) Конвертируем "E:\" -> "\\.\E:" (RAW путь)
string devicePath = dlg.SelectedDrive.ToFullPath();
try
{
ProgressBar.Visibility = Visibility.Visible;
string result = await Task.Run(() =>
{
using (var writer = new StringWriter())
{
BlockProcessor.Process(writer, devicePath);
return writer.ToString();
}
});
_currentFilePath = devicePath;
InfoLabel.Content = "USB (raw): " + devicePath;
LogBox.Text = result;
LogBox.ScrollToEnd();
}
catch (UnauthorizedAccessException)
{
LogBox.Text =
"Ошибка: отказано в доступе к USB как RAW-устройству.\r\n" +
"Запустите приложение от имени администратора.\r\n" +
$"Путь: {devicePath}";
}
catch (Exception ex)
{
LogBox.Text = $"Ошибка: {ex.Message}";
}
finally
{
ProgressBar.Visibility = Visibility.Collapsed;
}
}
private async void GetHrzButton_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(_currentFilePath))
{
MessageBox.Show(this, "Сначала выберите файл/диск для обработки.", "GetHrz",
MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
// Диалог сохранения
var sfd = new SaveFileDialog
{
Title = "Сохранить результат",
FileName = "Restore_hrz.hrz",
Filter = "HRZ files (*.hrz)|*.hrz|All files (*.*)|*.*",
AddExtension = true,
DefaultExt = ".hrz",
OverwritePrompt = true
};
if (sfd.ShowDialog(this) != true)
{
MessageBox.Show(this, "Сохранение отменено.", "GetHrz",
MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
string savePath = sfd.FileName;
ProgressBar.Visibility = Visibility.Visible;
try
{
// Лог будем собирать в фоне
var sb = new StringBuilder();
await Task.Run(() =>
{
using (var writer = new StringWriter(sb))
{
BlockProcessor.ProcessGetHrz(writer, _currentFilePath, savePath);
}
});
// Мы уже вернулись в UI поток после await
LogBox.AppendText(sb.ToString());
LogBox.AppendText(Environment.NewLine);
LogBox.ScrollToEnd();
}
catch (UnauthorizedAccessException ex)
{
MessageBox.Show(this,
"Ошибка доступа.\n" + ex.Message,
"GetHrz",
MessageBoxButton.OK,
MessageBoxImage.Error);
}
catch (Exception ex)
{
MessageBox.Show(this,
"Ошибка при повторном чтении:\n" + ex.Message,
"GetHrz",
MessageBoxButton.OK,
MessageBoxImage.Error);
}
finally
{
ProgressBar.Visibility = Visibility.Collapsed;
}
}
}
}