- Регистрация
- 22.03.2019
- Сообщения
- 1 737
- Благодарностей
- 1 130
- Баллы
- 113
Введение
Мой путь использования внешних данных был таков:
1. Использую файлы с чтением и прямой записью – тут комментарии излишни (баги, ошибки, потерянные данные)
2. Использования списков Zennoposter – Можно работать с одним файлом из разных шаблонов в рамках одного Zennoposter
3. Использования файлов на прямую, без привязки к спискам Zennoposter (для записи использовать lock) - Значительно увеличивает производительность и не жрет память на многопотоке
4. Использование базы данных – масштабирваться есть куда, увеличивается производительность.
5. Использование самописного API + MySQL – Распределение клиентских возможностей, нет привязки к конкретному компьютеру.
Но стояла задача – что делать с небольшими списками, иногда стабильными, иногда меняющиеся в течении времени?
Поднимать базу – ну такое себе, для клиентов не всегда удобно, а в некоторых случаях – невозможно. Использовать файлы – тут есть ограничения по удобству и производтельности.
И тут в голову пришла гениальная идея – а почему бу не использовать тот механизм, которые был и есть всегда в той среде, в которой работает зенка – реестр Windows.
Бинго и тут дело пошло.
Беглый гуглеж показал, что в одну запись можно засунуть до 1 мегабайта информации (примерно 1кк символов), в одной ветке до 512 мегабайт, а сам реестр можно забить до 4 гигабайт.
Учитывая то, что мы работаем с текстовой информацией и такие объемы ну точно не нужны, думаю, что для списков не слишком большого объема реестр можно использовать. Я проверял, в одну ветку спокойно поместилось 9000 строк.
Практика
Начнем с общего кода, так сказать основы для наших всех действий. Не пугайтесь, кода не много и разобраться в нем сможет подавляющее большинство зенопользователей.
Пихаем в юзинги
Пихаем в общий код, после всех закрывающихся скобок
Теперь перейдем к самим кубикам, в которых будем делать всю основную логику наших действий
Добавление записи
Если данные нужно добавить из переменных
Теперь давайте прочитаем данные
Ну а теперь попробуем удалить наш "Key"
Как видите, все просто.
А что делать с массивом?
Тут нам помогут циклы
Допустим у нас есть такой массив в переменной и его нужно перенести в реестр
Пишем код:
Теперь прочитаем, кто у нас директор
Ух ты, как неожидано ))
А как быть с данными, которые нужно обновлять с периодичностью, ну например в 10 минут?
Просто добавь ключ "timestamp" с текущим "unixtime"
и при каждом выполнении шаблона проверяй, не привысил ли он порогового значения от текущего "timestamp-600"
Если 600 секунд (10 минут) не прошло с даты прошлого добавления, то кубик пойдет по красной, если прошло - по зеленой.
Ну а как же удалить все записи, если они больше не нужны?
Заключение
Понятно, что данный механизм требует хоть какого нибудь знания и опыта, но, если включить фантазию, то по моему нет границ того, что нельзя было запихать в реестр, ведь он может хранить данные не только в строковых значениях, но и в байтах. А если запихать туда картинку в Base64... Держите меня семеро!
А ты мой юный читатель, что первое пришло тебе на ум, что можно туда запихать и использовать в зенке?
Мой путь использования внешних данных был таков:
1. Использую файлы с чтением и прямой записью – тут комментарии излишни (баги, ошибки, потерянные данные)
2. Использования списков Zennoposter – Можно работать с одним файлом из разных шаблонов в рамках одного Zennoposter
3. Использования файлов на прямую, без привязки к спискам Zennoposter (для записи использовать lock) - Значительно увеличивает производительность и не жрет память на многопотоке
4. Использование базы данных – масштабирваться есть куда, увеличивается производительность.
5. Использование самописного API + MySQL – Распределение клиентских возможностей, нет привязки к конкретному компьютеру.
Но стояла задача – что делать с небольшими списками, иногда стабильными, иногда меняющиеся в течении времени?
Поднимать базу – ну такое себе, для клиентов не всегда удобно, а в некоторых случаях – невозможно. Использовать файлы – тут есть ограничения по удобству и производтельности.
И тут в голову пришла гениальная идея – а почему бу не использовать тот механизм, которые был и есть всегда в той среде, в которой работает зенка – реестр Windows.
Бинго и тут дело пошло.
Беглый гуглеж показал, что в одну запись можно засунуть до 1 мегабайта информации (примерно 1кк символов), в одной ветке до 512 мегабайт, а сам реестр можно забить до 4 гигабайт.
Учитывая то, что мы работаем с текстовой информацией и такие объемы ну точно не нужны, думаю, что для списков не слишком большого объема реестр можно использовать. Я проверял, в одну ветку спокойно поместилось 9000 строк.
Практика
Начнем с общего кода, так сказать основы для наших всех действий. Не пугайтесь, кода не много и разобраться в нем сможет подавляющее большинство зенопользователей.
Пихаем в юзинги
using Microsoft.Win32;
Пихаем в общий код, после всех закрывающихся скобок
C#:
namespace RegEdit
{
public class RegistryHelper
{
private string _registryPath;
public RegistryHelper(string registryPath)
{
_registryPath = registryPath;
}
// Метод для записи строкового значения в реестр
public void WriteValue(string valueName, string value)
{
try
{
using (RegistryKey baseKey = Registry.CurrentUser.CreateSubKey(_registryPath))
{
if (baseKey != null)
{
baseKey.SetValue(valueName, value, RegistryValueKind.String);
}
}
}
catch (Exception ex)
{
throw new Exception($"Ошибка при записи в реестр: {ex.Message}");
}
}
// Метод для чтения строкового значения из реестра
public string ReadValue(string valueName)
{
try
{
using (RegistryKey baseKey = Registry.CurrentUser.OpenSubKey(_registryPath))
{
if (baseKey != null)
{
object value = baseKey.GetValue(valueName);
if (value != null)
{
return value.ToString();
}
}
return null;
}
}
catch (Exception ex)
{
throw new Exception($"Ошибка при чтении из реестра: {ex.Message}");
}
}
// Метод для удаления значения из реестра
public void DeleteValue(string valueName)
{
try
{
using (RegistryKey baseKey = Registry.CurrentUser.OpenSubKey(_registryPath, true))
{
if (baseKey != null)
{
baseKey.DeleteValue(valueName, false);
Console.WriteLine($"Значение {valueName} успешно удалено из реестра");
}
}
}
catch (Exception ex)
{
throw new Exception($"Ошибка при удалении из реестра: {ex.Message}");
}
}
// Метод для удаления всех значений в ключе реестра
public void DeleteAllValues()
{
try
{
using (RegistryKey baseKey = Registry.CurrentUser.OpenSubKey(_registryPath, true))
{
if (baseKey != null)
{
// Получаем все имена значений
string[] valueNames = baseKey.GetValueNames();
// Удаляем каждое значение
foreach (string valueName in valueNames)
{
baseKey.DeleteValue(valueName, false);
}
Console.WriteLine("Все значения успешно удалены");
}
else
{
throw new Exception($"Путь {_registryPath} не найден в реестре");
}
}
}
catch (Exception ex)
{
throw new Exception($"Ошибка при удалении значений: {ex.Message}");
}
}
}
}
Добавление записи
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
registry.WriteValue("Key", "Value");
Если данные нужно добавить из переменных
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
string Key = project.Variables["Key"].Value;
string Value = project.Variables["Value"].Value;
registry.WriteValue(Key, Value);
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
string Value = registry.ReadValue("Key");
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
registry.DeleteValue("Key");
А что делать с массивом?
Тут нам помогут циклы
Допустим у нас есть такой массив в переменной и его нужно перенести в реестр
Код:
Директор;Василий Иванович
Помощник;Петька
Секретарша;Анка
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
string input = project.Variables["data"].Value; // Тут наш массив
string[] entries = input.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
try
{
// Записываем все entries
foreach (string entry in entries)
{
string[] parts = entry.Split(';');
if (parts.Length == 2)
{
string Key = parts[0].Trim();
string Value = parts[1].Trim();
registry.WriteValue(Key, Value);
}
}
}
catch (Exception ex)
{
throw new Exception($"Ошибка при записи в реестр: {ex.Message}");
}
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
return registry.ReadValue("Директор");
Ух ты, как неожидано ))
А как быть с данными, которые нужно обновлять с периодичностью, ну например в 10 минут?
Просто добавь ключ "timestamp" с текущим "unixtime"
C#:
// Добавь выше строки "// Записываем все entries"
// Записываем текущее время
long unixTimestamp = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds();
registry.WriteValue("timestamp", unixTimestamp.ToString());
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
var timeStr = registry.ReadValue("timestamp");
int time_update = 0;
// Проверяем, есть ли значение времени в реестре
if (!string.IsNullOrEmpty(timeStr))
{
time_update = Convert.ToInt32(timeStr);
}
long timestamp = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds();
// Вычисляем абсолютную разницу во времени
int timeDifference = Math.Abs((int)timestamp - time_update);
bool isTimeToUpdate = timeDifference <= 600;
if(isTimeToUpdate)
{
throw new Exception($"Данные обновлять не пришло время: {timeDifference}");
}
Ну а как же удалить все записи, если они больше не нужны?
C#:
var registry = new RegEdit.RegistryHelper(@"SOFTWARE\MyApp");
registry.DeleteAllValues();
Заключение
Понятно, что данный механизм требует хоть какого нибудь знания и опыта, но, если включить фантазию, то по моему нет границ того, что нельзя было запихать в реестр, ведь он может хранить данные не только в строковых значениях, но и в байтах. А если запихать туда картинку в Base64... Держите меня семеро!
А ты мой юный читатель, что первое пришло тебе на ум, что можно туда запихать и использовать в зенке?
Вложения
-
19,9 КБ Просмотры: 9
Последнее редактирование: