Имеет ли .NET эквивалент файлов Java.properties?
Чтобы перетащить всю память, Java имеет эти файлы с расширением ".properties", которые в основном представляют собой текстовый файл ASCII, полный пар ключ-значение. В структуре есть несколько действительно простых способов сосать этот файл в (по существу) причудливый хэш файл.
Два больших преимущества (как я вижу) - это простота редактирования и чтения/записи вручную.
Есть ли у .NET эквивалент, испеченный? Конечно, я мог бы сделать то же самое с XML файлом, но мне бы не пришлось вручную вводить все эти угловые скобки, если вы знаете, что я имею в виду. Кроме того, хороший способ сосать все данные в структуру данных в памяти в одной строке.
(Боковая панель: я вроде бы не могу поверить, что здесь этого не спрашивали, но я не мог найти такой вопрос.)
Edit:
Чтобы ответить на вопрос, подразумеваемый некоторыми комментариями, я не ищу способ специально прочитать java файлы .properties в .NET, я ищу функциональный эквивалент в юниверсе .NET. (И я надеялся, что это не будет основано на XML, очевидно, что он забыл, что это .NET, о котором мы говорим.)
И, хотя файлы конфигурации близки, мне нужен способ для хранения каких-то произвольных строк, а не для информации о конфигурации приложения, поэтому фокус и дизайн файлов конфигурации выглядят неработоспособными.
Ответы
Ответ 1
Вы можете получить аналогичную функциональность для файлов свойств, используя встроенные файлы настроек (в VS добавьте новый "файл настроек",), но он по-прежнему основан на XML.
Вы можете получить доступ к настройкам с помощью автоматически созданного класса настроек и даже обновить их и сохранить их обратно в конфигурационный файл - все без написания кода шаблона. Установки являются сильно-типами и могут быть указаны как "Пользователь" (сохранены в папке Application Application Data) или "Приложение" (сохранены в той же папке, что и исполняемый exe).
Ответ 2
.NET-способ - использовать файл конфигурации ..NET Framework даже предлагает
API для работы с ними.
Ответ 3
Существует сторонний компонент, называемый nini, который можно найти в sourceforge.net
Пример:
using Nini;
using Nini.Config;
namespace niniDemo{
public class niniDemoClass{
public bool LoadIni(){
string configFileName = "demo.ini";
IniConfigSource configSource = new IniConfigSource(configFileName);
IConfig demoConfigSection = configSource.Configs["Demo"];
string demoVal = demoConfigSection.Get("demoVal", string.Empty);
}
}
}
Вышеприведенный пример файла demo.ini:
[Demo]
demoVal = foobar
Если значение demoVal
равно null или пустое, оно по умолчанию равно string.Empty
.
Ответ 4
Я не смог найти решение similer для файла свойств чтения с помощью С#. Я смог написать собственный код, используя С# для получения того же результата, что и в java.
Следуйте за кодом:
// watchValue- Property attribute which you need to get the value;
public string getProperty(string watchValue)
{
// string propertiesfilename= @"readFile.properties";
string[] lines = System.IO.File.ReadAllLines(propertiesfilename);
for (int i = 0; i < lines.Length; i++)
{
string prop_title = Regex.Split(lines[i], "=")[0].Trim();
if (prop_title == watchValue)
return Regex.Split(lines[i], "=")[1].Trim();
}
return null;
}
Моя идея -
Лично я считаю, что доступ к файлам свойств намного проще для пользователя, чем доступ к файлам XML.
Итак, если вы попытаетесь экпортировать свойство атрибута, лучше использовать файл свойств, чем XML.
Ответ 5
Я написал небольшую .NET-конфигурационную библиотеку под названием DotNet.Config, которая использует простые текстовые файлы свойств, созданные файлами Java.property. Он включает некоторые приятные функции для легкой загрузки. Вы можете получить копию здесь:
https://github.com/jknight/DotNet.Config
Ответ 6
Мне лично нравится этот фрагмент кода, который я нашел в Интернете. Это персонализированный способ чтения/записи в файле свойств.
public class Properties
{
private Dictionary<String, String> list;
private String filename;
public Properties(String file)
{
reload(file);
}
public String get(String field, String defValue)
{
return (get(field) == null) ? (defValue) : (get(field));
}
public String get(String field)
{
return (list.ContainsKey(field))?(list[field]):(null);
}
public void set(String field, Object value)
{
field = this.trimUnwantedChars(field);
value = this.trimUnwantedChars(value);
if (!list.ContainsKey(field))
list.Add(field, value.ToString());
else
list[field] = value.ToString();
}
public string trimUnwantedChars(string toTrim)
{
toTrim = toTrim.Replace(";", string.Empty);
toTrim = toTrim.Replace("#", string.Empty);
toTrim = toTrim.Replace("'", string.Empty);
toTrim = toTrim.Replace("=", string.Empty);
return toTrim;
}
public void Save()
{
Save(this.filename);
}
public void Save(String filename)
{
this.filename = filename;
if (!System.IO.File.Exists(filename))
System.IO.File.Create(filename);
System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
foreach(String prop in list.Keys.ToArray())
if (!String.IsNullOrWhiteSpace(list[prop]))
file.WriteLine(prop + "=" + list[prop]);
file.Close();
}
public void reload()
{
reload(this.filename);
}
public void reload(String filename)
{
this.filename = filename;
list = new Dictionary<String, String>();
if (System.IO.File.Exists(filename))
loadFromFile(filename);
else
System.IO.File.Create(filename);
}
private void loadFromFile(String file)
{
foreach (String line in System.IO.File.ReadAllLines(file))
{
if ((!String.IsNullOrEmpty(line)) &&
(!line.StartsWith(";")) &&
(!line.StartsWith("#")) &&
(!line.StartsWith("'")) &&
(line.Contains('=')))
{
int index = line.IndexOf('=');
String key = line.Substring(0, index).Trim();
String value = line.Substring(index + 1).Trim();
if ((value.StartsWith("\"") && value.EndsWith("\"")) ||
(value.StartsWith("'") && value.EndsWith("'")))
{
value = value.Substring(1, value.Length - 2);
}
try
{
//ignore duplicates
list.Add(key, value);
}
catch { }
}
}
}
}
Пример использования:
//load
Properties config = new Properties(fileConfig);
//get value whith default value
com_port.Text = config.get("com_port", "1");
//set value
config.set("com_port", com_port.Text);
//save
config.Save()