Вот как я это делаю в скрипте bash:
if ps ax | grep [110] | grep -v $ | grep bash | grep -v grep
then
echo "The script is already running."
exit 1
fi
Это позволяет мне использовать этот фрагмент для любого скрипта bash. Мне нужно было grep bash, потому что при использовании cron он создает другой процесс, который выполняет его, используя /bin/sh.
Вы можете сохранить информацию о своих настройках как Strings
XML в Settings.Default
. Создайте несколько классов для хранения ваших данных конфигурации и убедитесь, что они [Serializable]
. Затем с помощью следующих помощников вы можете сериализовать экземпляры этих объектов - или List<T>
(или массивы T[]
и т. Д.) Из них - в String
. Храните каждую из этих различных строк в своем соответствующем слоте Settings.Default
в Settings
.
Чтобы восстановить объекты при следующем запуске приложения, прочитайте интересующую строку Settings
и Deserialize
ожидаемый тип T
(который на этот раз должен быть явно указан в качестве аргумента типа для Deserialize<T>
) .
public static String Serialize<T>(T t)
{
using (StringWriter sw = new StringWriter())
using (XmlWriter xw = XmlWriter.Create(sw))
{
new XmlSerializer(typeof(T)).Serialize(xw, t);
return sw.GetStringBuilder().ToString();
}
}
public static T Deserialize<T>(String s_xml)
{
using (XmlReader xw = XmlReader.Create(new StringReader(s_xml)))
return (T)new XmlSerializer(typeof(T)).Deserialize(xw);
}
Наиболее распространенный подход к этому вопросу - «Изолированное хранилище».
Сериализуйте свое состояние управления в XML или другой формат (особенно легко, если вы сохраняете свойства зависимостей в WPF), затем сохраните файл в изолированном хранилище пользователя.
Если вы хотите пойти по пути настройки приложения, я сам попробовал что-то похожее ... хотя следующий подход можно легко адаптировать для использования изолированного хранилища:
class SettingsManager
{
public static void LoadSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
{
EnsureProperties(sender, savedElements);
foreach (FrameworkElement element in savedElements.Keys)
{
try
{
element.SetValue(savedElements[element], Properties.Settings.Default[sender.Name + "." + element.Name]);
}
catch (Exception ex) { }
}
}
public static void SaveSettings(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
{
EnsureProperties(sender, savedElements);
foreach (FrameworkElement element in savedElements.Keys)
{
Properties.Settings.Default[sender.Name + "." + element.Name] = element.GetValue(savedElements[element]);
}
Properties.Settings.Default.Save();
}
public static void EnsureProperties(FrameworkElement sender, Dictionary<FrameworkElement, DependencyProperty> savedElements)
{
foreach (FrameworkElement element in savedElements.Keys)
{
bool hasProperty =
Properties.Settings.Default.Properties[sender.Name + "." + element.Name] != null;
if (!hasProperty)
{
SettingsAttributeDictionary attributes = new SettingsAttributeDictionary();
UserScopedSettingAttribute attribute = new UserScopedSettingAttribute();
attributes.Add(attribute.GetType(), attribute);
SettingsProperty property = new SettingsProperty(sender.Name + "." + element.Name,
savedElements[element].DefaultMetadata.DefaultValue.GetType(), Properties.Settings.Default.Providers["LocalFileSettingsProvider"], false, null, SettingsSerializeAs.String, attributes, true, true);
Properties.Settings.Default.Properties.Add(property);
}
}
Properties.Settings.Default.Reload();
}
}
... ..и ....
Dictionary<FrameworkElement, DependencyProperty> savedElements = new Dictionary<FrameworkElement, DependencyProperty>();
public Window_Load(object sender, EventArgs e) {
savedElements.Add(firstNameText, TextBox.TextProperty);
savedElements.Add(lastNameText, TextBox.TextProperty);
SettingsManager.LoadSettings(this, savedElements);
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
SettingsManager.SaveSettings(this, savedElements);
}
По моему опыту, сохранение всех настроек в таблице базы данных - лучшее решение. Даже не беспокойтесь о производительности. Современные базы данных быстры и могут легко хранить тысячи столбцов в таблице. Я усвоил этот трудный путь - до того, как начал сериализовать / десериализовать - кошмар. Хранение его в локальном файле или реестре имеет одну большую проблему - если вам нужно поддерживать ваше приложение и компьютер выключен - пользователь не перед ним - вы ничего не можете сделать .... если настройки находятся в БД - вы можете поменял их и альт не говоря уже о том, что можно сравнивать настройки ....
Во всех местах, где я работал, база данных была обязательной из-за поддержки приложений. Как сказал Адам, пользователь может не находиться за своим рабочим столом, или машина может быть выключена, или вы можете быстро изменить чью-либо конфигурацию или назначить новичку конфигурацию по умолчанию (или члена команды).
Если настройки могут увеличиваться по мере выпуска новых версий приложения, вы можете сохранить данные в виде больших двоичных объектов, которые затем могут быть десериализованы приложением. Это особенно полезно, если вы используете что-то вроде Prism, которое обнаруживает модули, так как вы не можете знать, какие настройки вернет модуль. Блобы могут быть введены с помощью комбинированного ключа «имя пользователя / машина». Таким образом, вы можете иметь разные настройки для каждой машины.
Я не использовал встроенный класс «Настройки», поэтому воздержусь от комментариев. :)