using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace NotesDataAnalyst.NoteContent { public class FileSaver : INotifyPropertyChanged { // Базовый путь, где будут храниться все заметки private readonly string _basePath; private ObservableCollection _files; // Коллекция для хранения путей к сохранённым файлам public ObservableCollection Files { get => _files; private set { _files = value; OnPropertyChanged(nameof(Files)); } } public FileSaver(string basePath) { // Устанавливаем базовый путь и инициализируем коллекцию файлов _basePath = basePath; Files = new ObservableCollection(); } // Создаёт путь к файлу на основе категории и заголовка private string GenerateFilePath(Note note) { // Определяем путь для папки категории string categoryFolder = Path.Combine(_basePath, note.Category); // Создаём папку, если её ещё нет Directory.CreateDirectory(categoryFolder); // Преобразуем заголовок в имя файла, удаляя недопустимые символы string fileName = SanitizeFileName(note.Title) + ".json"; // Полный путь к файлу return Path.Combine(categoryFolder, fileName); } // Удаляет недопустимые символы из заголовка для имени файла private string SanitizeFileName(string title) { // Заменяем символы, которые нельзя использовать в именах файлов, на подчёркивания return Regex.Replace(title, @"[<>:""/\|?*]", "_"); } public void SaveData(Note note) { // Если у заметки есть путь к файлу, обновляем существующий файл string filePath = !string.IsNullOrEmpty(note.FilePath) ? note.FilePath : GenerateFilePath(note); string jsonString = JsonSerializer.Serialize(note); File.WriteAllText(filePath, jsonString); // Если это новая заметка, добавляем её путь в коллекцию if (!Files.Contains(filePath)) { Files.Add(filePath); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }