|
|
|
|
Канал X4: Foundations: «[SOFT] X4 Launcher and X4SaveAutoBackup» |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Навигатор сохранений сильно что-то напоминает...
Не могу вспомнить что )
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
От не поверишь, даже не представляю... но ни чего не приходит на ум
Но если ты на что то намекаешь ... то намекай попрямее
АААА
ты про это )))
https://iimg.su/i/bLMWlX
ну да иде нагло сворована, но я не приче м Это все он, ооон - Злой рооооккк...
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (12:19 02-06-2026), всего редактировалось 2 раз(а) |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
иде нагло сворована
|
Нормально, я не против ).
Ни че так получилось.
Главное вовремя остановится в развитии бэкапера, а то так софтина станет лучше самой игры...
добавлено спустя 5 минут:
В общем, вчера играл вечером с бэкапером 1.0.7 - все работает. Если файлы сохранок менялись (в основном квиксейв), прога четко их бекапила по времени.
Единственно что - один косячок есть, касательно контролов формы: листбокс с Аккаунтами - выделенные аккаунты (не отмеченные флажком, а именно выделенные) чекаются просто по ЛКМ по пустому полю листбокса. Странное поведение..
Последний раз редактировалось: igorVL (12:40 02-06-2026), всего редактировалось 1 раз |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Upd:
- исправь название вкладки "Общие настройки".
- вкладка "Настройки исключений": "Сохранения исключаемые из бэкапа".
Последний раз редактировалось: igorVL (15:36 02-06-2026), всего редактировалось 2 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
| igorVL : |
|
чекаются просто по ЛКМ по пустому полю листбокса. Странное поведение..
|
Это поведение listbox, я не знаю что вместо него использовать .
Я пробовал отключить его функции по умолчанию , но безрезультатно.
| igorVL : |
исправь название вкладки "Общие настройки".
- вкладка "Настройки исключений": "Сохранения исключаемые из бэкапа".
|
Спасибо, исправил.
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите.... |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Upd Upd:
Ну и небольшая деталь, про которую еще вчера хотел сказать, но заигрался в "Выборе Хатиква"...:
файлы сохранок "quicksave", "save_xxx" и прочие - изменяются только самой игрой как бЭ . Т.е. не предполагается, что их менять будет что-то/кто-то еще извне.
Поэтому, функция "Бэкапить только при запущенной игре" (отслеживать процессы X4/Rebirth) теряет смысл. Если игры не запущены, то и файлы сейвов не изменяться - бэкапить будет нечего.
Таким образом, функционал бэкапера сводиться только лишь к отслеживанию папки сохранок на предмет изменений файлов. Следить за процессами игр - не нужно от слова совсем.
добавлено спустя 6 минут:
| alexalsp : |
|
Это поведение listbox
|
Нет такого поведения у контейнера listbox (по умолчанию). Видимо, в хендлере выбора элементов листбокса прописана лишняя подписка на ЛКМ по самому листбоксу. Ее нужно убрать.
Check/UnCheck элемента должен быть только по ЛКМ на самом элементе, а не вне его..
добавлено спустя 18 минут:
При тычке ЛКМ по пустому полю листбокса - должно сниматься выделение с выделенного элемента (это поведение по умолчанию). У тебя не снимается, поэтому происходит чек/анчек.
В обработчике события клика что-то прописано не так.
Последний раз редактировалось: igorVL (16:40 02-06-2026), всего редактировалось 2 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
checkedListBox
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите.... |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
|
checkedListBox
|
Гляну позже на этого зверя.. Посмотрим что можно сделать.
добавлено спустя 32 минуты:
| igorVL : |
|
Посмотрим что можно сделать
|
Да, противный компонент. Но мы его победим!
Сделай следующее:
В свойствах checkedListBox установи SelectionMode = None.
Выкинь событие MouseDown().
Вместо него подпишись на событие checkedListBox_Click().
Внутри этого события, перед своим кодом вставь:
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
private void checkedListBox_Click(object sender, EventArgs e)
{
for (int i = 0; i < checkedListBox.Items.Count; i++)
{
if (checkedListBox.GetItemRectangle(i).Contains(checkedListBox.PointToClient(MousePosition)))
{
switch (checkedListBox.GetItemCheckState(i))
{
case CheckState.Checked:
checkedListBox.SetItemCheckState(i, CheckState.Unchecked);
break;
case CheckState.Indeterminate:
case CheckState.Unchecked:
checkedListBox.SetItemCheckState(i, CheckState.Checked);
break;
}
}
}
} |
|
Выделяться элементы теперь не будут, зато галочки будут работать исправно.
Последний раз редактировалось: igorVL (19:00 02-06-2026), всего редактировалось 2 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Тогда придется с меню правой кнопки мыши играться, что бы при клике по объекту правой мышой по меню открывала папку бэкапа .
С правой кнопкой кое как справился ))
Спасибо, кучу мусора забытого неактивного выкинул, пока с 'bv чеклистом разбирался ))
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (20:25 02-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
X4SaveAutoBackup
1.0.8 - РЕЛИЗ
- Добавлена навигация и информация о файлах сохранений, кнопка Обозреватель сохранений.
- Добавлены в навигацию сохранений кнопки:
Открыть - открыть папку выбранного сохранения
Обновит - обновляет список дерева сохранений
Восстановить - восстанавливает выбранное сохранение в папку сохранений с резервированием имеющегося файла
Для полноценной информации по сейвам необходимо указать папки с играми.
- изменен вывод процессов, теперь ни какого моргания.
- WMI Event Watchers для мгновенного отслеживания игр
- Fallback режим (опрос каждые 3 секунды) при недоступности WMI
- некоторые изменения в дизайне Навигатора сохранений.
- в информацитю о сохранения добавлен пункт о старте игры в котором создан сейв.
ИСПРАВЛЕНИЯ
1. Исправлена потеря данных при неудачном резервировании - хеш папки сохраняется в конфиг только после успешного создания бэкапа. Если бэкап не создался (нет места, ошибка доступа), программа не запоминает изменения и при следующей проверке снова попытается сделать бэкап
2. Исправлена уязвимость Path Traversal - при открытии папки бэкапов через контекстное меню добавлена проверка имени аккаунта (разрешены только цифры, запрещены точки, слеши и другие спецсимволы). Это не дает злоумышленнику выйти за пределы папки программы и открыть системные папки
3. Исправлена гонка потоков в WMI обработчиках - при обнаружении закрытия игры программа сразу запускает бэкап. Добавлена проверка: если бэкап уже выполняется, новый не запускается, а просто логируется пропуск
4. Исправлена проблема с цепочкой бэкапов в Fallback таймере - при использовании резервного режима мониторинга (когда WMI недоступен) добавлена защита от повторного входа. Таймер больше не может запустить новый бэкап пока выполняется старый
5. Исправлено принудительное закрытие программы во время бэкапа - при попытке закрыть программу во время создания резервной копии появляется окно с выбором: дождаться завершения бэкапа (рекомендуется), закрыть принудительно (риск повреждения файлов) или отменить закрытие
6. Исправлено некорректное удаление старых бэкапов - при удалении старых копий программа сначала снимает атрибут "Только чтение" со всех файлов, иначе Windows не дает их удалить. Также добавлена обработка ошибок доступа и блокировки файлов другими процессами
7. Исправлено переполнение лог-файла - файл логов больше не может вырасти больше 2 МБ. При достижении лимита старый лог архивируется с меткой времени, создается новый. Старые архивы автоматически удаляются, остается только 5 последних. (Логируются только DEBUG сборки, в RELEASE сборке логи отключены полностью)
8. Исправлена потеря хешей для новых аккаунтов - при первом обнаружении новой папки с сохранениями хеш временно сохраняется в конфиг, но окончательно фиксируется только после успешного создания первого бэкапа. Если бэкап не создался, при следующей проверке программа снова определит папку как новую
9. Исправлена проверка свободного места перед бэкапом - перед началом копирования программа подсчитывает общий размер всех файлов, которые будут скопированы, и проверяет что на диске есть свободное место с запасом 10%. Если места недостаточно, бэкап не создается, в лог пишется ошибка
10. Исправлена утечка памяти в WMI подсистеме - при остановке мониторинга процессов или закрытии программы все WMI watcher'ы корректно останавливаются и освобождают ресурсы. Раньше они продолжали висеть в памяти до перезагрузки системы
11. Исправлен запуск бэкапа во время закрытия программы - добавлена защита от ситуации, когда пользователь закрывает программу, а в этот момент срабатывает таймер или WMI событие. Теперь программа не пытается создать новый бэкап, если процесс завершения уже начался
12 Срабатывание переключения выделеных элементов в чеклистбоксах при клике в пустом месте чеклистбокса не по элементу (спасибо за помощь пилоту igorVL)
ПРИМЕЧАНИЕ:
WMI Event Watchers НЕ ЗАМЕНИЛИ опрос, а ДОПОЛНИЛИ его.
Теперь программа работает так:
ШАГ 1: Пытается подключить WMI Event Watchers (мгновенный режим)
ШАГ 2: Если получилось → программа просто ждет сигнала от Windows
ШАГ 3: Как только игра запускается или закрывается → Windows САМА шлет сигнал
ШАГ 4: Реакция происходит МГНОВЕННО, нагрузка НУЛЕВАЯ
НО ЕСЛИ WMI НЕ РАБОТАЕТ:
Автоматически включается FALLBACK (запасной) режим:
- Таймер с интервалом 3 секунды (вместо 5)
- Использует обычные системные вызовы
- Программа продолжает работать, но чуть медленнее
|
Скриншоты (кликните здесь для просмотра)
|
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (22:02 02-06-2026), всего редактировалось 2 раз(а) |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
натсройки все так же остались..
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Я просто не понял, что с ними не так )))
мониторинг без только при игре , при выходе из игры делает бэкап.
при игре только во время игры с включенным автобэкапом
если при игре выключен а атобэкап включен, то он делает при запущенной программе бэкапы всегда по времени проверяя на изменение конечно.
каждая настройка для своего дела )))
забыл ты выгрузить программу она работает )) если настройка при игре , она работает но ни чего не делает .
не вижу тут лишних параметров ))
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (23:43 02-06-2026), всего редактировалось 1 раз |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
| alexalsp : |
не вижу тут лишних параметров ))
|
В самом слове "натсройки" ошибка!
|
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Троль троль , бедного старого человека , не стыда не совести
Спасибо , исправлю в новой версии
добавлено спустя 18 минут:
АААА, теперь понял о чем ты
добавлено спустя 56 минут:
X4SaveAutoBackup
1.0.9
- Внедрен механизм блоркировки элементов Навигатора сохранений
Теперь будет выводится сообщение о необходимости выбора папки игры,
после чего данные по выбранной игре будут разблокированы.
- исправлены опечатки текста, сноваааа.....
|
Скриншоты (кликните здесь для просмотра)
|
добавлено спустя 12 минут:
В общем гонка закончилась, теперь только тесты, все что требовалось, добавилось ...
Если кому зашло, пиво мне, а цветы - igorVL.
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (01:48 03-06-2026), всего редактировалось 5 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
X4SaveAutoBackup
1.0.10
НОВОЕ
- Резервные копии ZIP-архивов теперь отображаются в дереве проводника сохранений как папки.
Вы можете просматривать сохранения внутри них, как в обычных папках, и восстанавливать
отдельные сохранения непосредственно из ZIP-архивов.
Больше нет необходимости делать это вручную.
ИЗМЕНЕНИЯ
- Дерево проводника сохранений теперь отображает только данные сохранений, принадлежащие текущей выбранной папке игры.
- Обновлены значки, используемые в дереве сохранений.
ПРИМЕЧАНИЕ:
Поскольку уже есть возможность сохранять резервные копии в ZIP-архивах,
было логично добавить и полноценную функциональность управления ZIP-архивами.
В противном случае это выглядело бы как незавершенная функция...
|
Скриншоты (кликните здесь для просмотра)
|
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите.... |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Сделал ручной бэкап (1 раз) без опции сжатия: бэкап создался.
Включил опцию "сжимать в ZIP" - больше бэкапов не создается.. Никаких, ZIP/не ZIP... Даже после перезапуска программы.
добавлено спустя 40 минут:
P.S.
Понял почему: в JSON записался хеш последних файлов и они не изменялись. Однако, нужно в добавок проверять наличие бэкапа вообще.
Т.е. я сделал бэкап, а потом удалил всю папку бэкапов. Бэкапов нет, но и ручной теперь не создать, пока файлы не изменяться...
Логику нужно дополнить.
добавлено спустя 18 минут:
|
Cкрытый текст (кликните здесь для просмотра)
Обнаружил в коде бэкапера спертый у меня метод расширения OnUIThread((Action))
Метод написан для того, чтобы оборачивать в него работу с контролами формы в случаях потенциального доступа к таким контролам из других потоков, не из UI-потока. Его не нужно вставлять "куда ни попадя" везде и всюду
Например, в методе "ExtractPlayerInfo" он буквально натыкан на каждом шагу, хотя здесь это не нужно вовсе.
|
Последний раз редактировалось: igorVL (12:12 04-06-2026), всего редактировалось 2 раз(а) |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
Ни кто ни чего не спер, просто подсмотрел , ты же смотришь
добавлено спустя 1 минуту:
| igorVL : |
Понял почему: в JSON записался хеш последних файлов и они не изменялись. Однако, нужно в добавок проверять наличие бэкапа вообще.
Т.е. я сделал бэкап, а потом удалил всю папку бэкапов. Бэкапов нет, но и ручной теперь не создать, пока файлы не изменяться...
Логику нужно дополнить.
|
Спасибо, дополним.
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (12:19 04-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
X4SaveAutoBackup
1.0.11
ДОБАВЛЕНО
- Проверка наличия в папке бэкап папок резервных копий или ZIP бэкапов.
Если таких нет, то при записанном в конфиг хешей папок будет создана копия.
(Раньше при наличии записи в конфиге была проверка по хешу но не было
проверки по наличию файлов в папке бэкап.)
(Спасибо пилоту - igorVL)
- В навигатор сохранений добавлен выбор языка игры для просмотра информации
о сохранении на нужном вам языке.
Для Х4 - все языки списка поддерживаются. Для XRebirth 8 языков, если выбран
язык в списке которого нет в поддержке игры, то по умолчанию будет выбран
текстовый файл игры АНГЛИЙСКИЙ.
ИЗМЕНЕНО
- При открытии Навигатора сохранений проверяются файлы начинающиеся на X4 и X Rebirth,
как для отображения данных сейвов в дереве, так и для извлечения из них значков для
корневых узлов игры в дереве сохранений.
Если файлов в папке нет, то будет считаться, что путь отсутствует и данные по игре
будут скрыты, а путь очищен.
- Лог файлы теперь записываются в папку Log. Для программы и навигатора сохранений
максимум 10 лог файлов, по достижению максимума старый перезаписывается новым.
ИСПРАВЛЕНИЯ
- Убраны лишние вызовы, подчищен код и хвосты экспериментов... или как говорится - "оптимизация кода " ))
|
Скриншоты (кликните здесь для просмотра)
|
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (18:17 04-06-2026), всего редактировалось 1 раз |
|
|
|
igorVL
65 EGP Рейтинг канала: 6(280) Репутация: 2 Сообщения: 304 Откуда: Москва Зарегистрирован: 04.08.2023
 |
|
Найду же все равно еще что-то (косяк)...
добавлено спустя 15 минут:
|
Совет (кликните здесь для просмотра)
В методе ExtractSaveInfo, при чтении строк StreamReader'ом у тебя стоит условие "!= null", т.е. читать весь файл.
Выход из цикла осуществляется по флагу flag, который становится true в случае выполнения довольно монструозного условия.
Это излишне. Вся необходимая инфа про игру и игрока содержится в узле <info> ... </info>.
Поэтому, достаточно читать строки, пока не встретится закрывающий тег </info>.
Вся конструкция превращается всего лишь в:
| Код: |
{
string line;
while ((line = streamReader.ReadLine()) != "</info>")
xmlContent += line + "\n";
}
|
Без всяких флажков и прочей ереси..
|
Последний раз редактировалось: igorVL (19:55 04-06-2026), всего редактировалось 1 раз |
|
|
|
alexalsp
542 EGP
      Рейтинг канала: 14(2392) Репутация: 56 Сообщения: 4881
Зарегистрирован: 12.08.2014
 |
|
В таком исполнении ?
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
private void ExtractSaveInfo(string filePath)
{
try
{
string xmlContent = "";
if (filePath.EndsWith(".gz"))
{
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress))
using (var reader = new StreamReader(gzipStream, Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != "</info>")
xmlContent += line + "\n";
}
}
else
{
using (var reader = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != "</info>")
xmlContent += line + "\n";
}
}
ExtractPlayerInfo(xmlContent, filePath);
}
catch (Exception ex)
{
ClearAllInfo(true);
lblPlayerName.Text = $"Ошибка чтения: {ex.Message}";
lblPlayerName.ForeColor = Color.Red;
}
} |
|
или так
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
private void ExtractSaveInfo(string filePath)
{
try
{
var sb = new StringBuilder();
bool isGzip = filePath.EndsWith(".gz", StringComparison.OrdinalIgnoreCase);
// Открываем файловый поток один раз
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
// Если .gz - оборачиваем в GZipStream, если нет - используем поток напрямую
Stream stream = isGzip ? new GZipStream(fileStream, CompressionMode.Decompress) : (Stream)fileStream;
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
string line;
// Читаем построчно
while ((line = reader.ReadLine()) != null)
{
sb.AppendLine(line);
// Прерываем чтение, как только встретили конец блока
if (line.Trim() == "</info>") break;
}
}
}
ExtractPlayerInfo(sb.ToString(), filePath);
}
catch (Exception ex)
{
ClearAllInfo(true);
lblPlayerName.Text = $"Ошибка чтения: {ex.Message}";
lblPlayerName.ForeColor = Color.Red;
}
}
|
|
Но это если сев всегда построчный , если что то случится и он где то или весь станет в одну строку . то пиши пропало. А я еще тот перестрахуй )))
Перестрахойня ))
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
private void ExtractSaveInfo(string filePath)
{
try
{
var sb = new StringBuilder();
string endTag = "</info>";
string buffer = ""; // Буфер для поиска тега
bool isGzip = filePath.EndsWith(".gz", StringComparison.OrdinalIgnoreCase);
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream stream = isGzip ? new GZipStream(fileStream, CompressionMode.Decompress) : (Stream)fileStream)
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
int charCode;
// Читаем посимвольно
while ((charCode = reader.Read()) != -1)
{
char c = (char)charCode;
sb.Append(c);
buffer += c;
// Если буфер стал длиннее тега, отсекаем лишнее начало
if (buffer.Length > endTag.Length)
buffer = buffer.Substring(1);
// Если нашли конец блока - останавливаемся
if (buffer == endTag)
break;
}
}
// Передаем то, что успели собрать
ExtractPlayerInfo(sb.ToString(), filePath);
}
catch (Exception ex)
{
ClearAllInfo(true);
lblPlayerName.Text = $"Ошибка чтения: {ex.Message}";
lblPlayerName.ForeColor = Color.Red;
}
}
|
|
|
Cкрытый текст (кликните здесь для просмотра)
| Код: |
[04.06.2026 20:49:28.102] КОНФИГ СОХРАНЕН! Размер: 692 байт
[04.06.2026 20:49:28.263] КОНФИГ СОХРАНЕН! Размер: 692 байт
[04.06.2026 20:49:31.549] [ExtractSaveInfo] Начато чтение: quicksave.xml
[04.06.2026 20:49:31.549] [ExtractSaveInfo] Тип файла: Обычный XML
[04.06.2026 20:49:31.550] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:49:31.550] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:49:32.779] [ExtractSaveInfo] Начато чтение: save_002.xml.gz
[04.06.2026 20:49:32.779] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:49:32.780] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1442
[04.06.2026 20:49:32.780] [ExtractSaveInfo] Успешно извлечено 1442 символов XML.
[04.06.2026 20:50:11.677] [ExtractSaveInfo] Начато чтение: quicksave.xml.gz
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:50:11.678] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:50:14.214] [ExtractSaveInfo] Начато чтение: quicksave.xml
[04.06.2026 20:50:14.215] [ExtractSaveInfo] Тип файла: Обычный XML
[04.06.2026 20:50:14.215] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1453
[04.06.2026 20:50:14.216] [ExtractSaveInfo] Успешно извлечено 1453 символов XML.
[04.06.2026 20:50:16.600] [ExtractSaveInfo] Начато чтение: save_003.xml.gz
[04.06.2026 20:50:16.600] [ExtractSaveInfo] Тип файла: GZip (сжатый)
[04.06.2026 20:50:16.601] [ExtractSaveInfo] Тег </info> найден. Прочитано символов: 1442
[04.06.2026 20:50:16.601] [ExtractSaveInfo] Успешно извлечено 1442 символов XML.
|
| Код: |
private void ExtractSaveInfo(string filePath)
{
WriteLog($"[ExtractSaveInfo] Начато чтение: {Path.GetFileName(filePath)}");
try
{
var sb = new StringBuilder();
string endTag = "</info>";
string buffer = "";
bool isGzip = filePath.EndsWith(".gz", StringComparison.OrdinalIgnoreCase);
WriteLog($"[ExtractSaveInfo] Тип файла: {(isGzip ? "GZip (сжатый)" : "Обычный XML")}");
using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
using (Stream stream = isGzip ? new GZipStream(fileStream, CompressionMode.Decompress) : (Stream)fileStream)
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
int charCode;
int totalChars = 0;
// Посимвольное чтение для максимальной гибкости
while ((charCode = reader.Read()) != -1)
{
char c = (char)charCode;
sb.Append(c);
buffer += c;
totalChars++;
// Поддерживаем размер буфера равным длине тега
if (buffer.Length > endTag.Length)
buffer = buffer.Substring(1);
// Если нашли тег — прерываем чтение, чтобы не читать весь файл
if (buffer == endTag)
{
WriteLog($"[ExtractSaveInfo] Тег {endTag} найден. Прочитано символов: {totalChars}");
break;
}
}
}
string result = sb.ToString();
WriteLog($"[ExtractSaveInfo] Успешно извлечено {result.Length} символов XML.");
// Передаем данные дальше
ExtractPlayerInfo(result, filePath);
}
catch (Exception ex)
{
WriteLog($"[ExtractSaveInfo] КРИТИЧЕСКАЯ ОШИБКА: {ex.Message}");
ClearAllInfo(true);
lblPlayerName.Text = $"Ошибка чтения: {ex.Message}";
lblPlayerName.ForeColor = Color.Red;
}
}
|
|
_________________ CMDR: Fallout(EG)
ED - если застряли: https://discord.gg/yZqwPbJaCq
https://t.me/+ApizhYp4JD9kMjU6
Пользуйте мои моды как хотите....
Последний раз редактировалось: alexalsp (20:48 04-06-2026), всего редактировалось 6 раз(а) |
|
|
|
|
|
|
|
|
Канал X4: Foundations: «[SOFT] X4 Launcher and X4SaveAutoBackup» |
|
|