Может ли .NET загрузить и проанализировать файл свойств, эквивалентный классу свойств Java? - PullRequest
52 голосов
/ 28 января 2009

Есть ли в C # простой способ прочитать файл свойств, каждое свойство которого находится на отдельной строке, за которой следует знак равенства и значение, например:

ServerName=prod-srv1
Port=8888
CustomProperty=Any value

В Java класс Properties легко обрабатывает этот анализ:

Properties myProperties=new Properties();
FileInputStream fis = new FileInputStream (new File("CustomProps.properties"));
myProperties.load(fis);
System.out.println(myProperties.getProperty("ServerName"));
System.out.println(myProperties.getProperty("CustomProperty"));

Я могу легко загрузить файл в C # и проанализировать каждую строку, но есть ли встроенный способ, позволяющий легко получить свойство без разбора имени ключа и знака равенства? Информация C #, которую я нашел, кажется, всегда в пользу XML, но это существующий файл, который я не контролирую, и я бы предпочел сохранить его в существующем формате, так как потребуется больше времени, чтобы другая команда сменила его на XML чем анализ существующего файла.

Ответы [ 14 ]

1 голос
/ 28 января 2009

C # обычно использует конфигурационные файлы на основе xml, а не файл в стиле * .ini, как вы сказали, поэтому для этого нет ничего встроенного. Однако Google возвращает количество многообещающих результатов .

0 голосов
/ 15 февраля 2018

Нет, нет: Но я создал один простой класс, чтобы помочь:

public class PropertiesUtility
{
    private static Hashtable ht = new Hashtable();
    public void loadProperties(string path)
    {
        string[] lines = System.IO.File.ReadAllLines(path);
        bool readFlag = false;
        foreach (string line in lines)
        {
            string text = Regex.Replace(line, @"\s+", "");
            readFlag =  checkSyntax(text);
            if (readFlag)
            {
                string[] splitText = text.Split('=');
                ht.Add(splitText[0].ToLower(), splitText[1]);
            }
        }
    }

    private bool checkSyntax(string line)
    {
        if (String.IsNullOrEmpty(line) || line[0].Equals('['))
        {
            return false;
        }

        if (line.Contains("=") && !String.IsNullOrEmpty(line.Split('=')[0]) && !String.IsNullOrEmpty(line.Split('=')[1]))
        {
            return true;
        }
        else
        {
            throw new Exception("Can not Parse Properties file please verify the syntax");
        }
    }

    public string getProperty(string key)
    {
        if (ht.Contains(key))
        {
            return ht[key].ToString();
        }
        else
        {
            throw new Exception("Property:" + key + "Does not exist");
        }

    }
}

Надеюсь, это поможет.

0 голосов
/ 15 июня 2015

Есть точное решение того, что вы хотите. пожалуйста, найдите статью от здесь

его код имеет ряд сильных сторон в отношении эффективности.

  1. Приложение не загружает текстовый файл при каждом запросе. Это загружает текстовый файл только один раз в память. Для последующего запрос, он возвращает значение непосредственно из памяти. Это много более эффективно, если ваш текстовый файл содержит тысячи и более пары ключ-значение.
  2. Любые изменения в текстовом файле не требуют перезапуска приложения. наблюдатель файловой системы был использован для отслеживания состояния файла. Если это изменяется, это вызывает событие и загружает новые изменения соответственно памяти, так что вы можете изменить текстовый файл в одном приложение / текстовый редактор и увидеть измененный эффект в Интернете применение.
  3. Вы можете не только использовать его в веб-приложении, но и можете использовать его в любом настольном приложении.

Спасибо. Хорошего дня.

0 голосов
/ 16 марта 2010

Я понимаю, что это не совсем то, что вы спрашиваете, но на всякий случай:

Если вы хотите загрузить фактический файл свойств Java, вам нужно будет разместить его кодировку. Документы Java указывают, что кодировкой является ISO 8859-1, которая содержит некоторые escape-последовательности, которые вы, возможно, неправильно интерпретируете. Например, посмотрите на этот SO-ответ , чтобы увидеть, что необходимо для превращения UTF-8 в ISO 8859-1 (и наоборот)

Когда нам нужно было сделать это, мы нашли открытый код PropertyFile.cs с открытым исходным кодом и внесли несколько изменений для поддержки escape-последовательностей. Этот класс хорош для сценариев чтения / записи. Вам также понадобится вспомогательный класс PropertyFileIterator.cs .

Даже если вы не загружаете истинные свойства Java, убедитесь, что ваш проп-файл может содержать все символы, которые необходимо сохранить (по крайней мере, UTF-8)

...