Может ли .NET загрузить и проанализировать файл свойств, эквивалентный классу свойств Java?

StackOverflow https://stackoverflow.com/questions/485659

Вопрос

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

родовое слово

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

родовое слово

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

Это было полезно?

Решение

Нет, для этого нет встроенной поддержки.

Вы должны создать свой собственный "INIFileReader". Может, как-то так?

родовое слово

Изменить: обновлено с учетом комментария Пола.

Другие советы

Большинство файлов Java ".properties" можно разделить, предположив, что в качестве разделителя используется "=", но формат значительно сложнее этого и позволяет встраивать пробелы, символы равенства, новые строки и любые символы Юникода в любом имени свойства.или значение.

Мне нужно было загрузить некоторые свойства Java для приложения C #, поэтому я реализовал JavaProperties.cs для правильного чтения и записи файлов в формате ".properties", используя тот же подход, что и в версии Java - вы можете найти его по адресу http://www.kajabity.com/index.php / 2009/06 / loading-java-properties-files-in-csharp / .

Там вы найдете zip-файл, содержащий исходный код C # для класса и несколько примеров файлов свойств, с которыми я его тестировал.

Наслаждайтесь!

Заключительное занятие.Спасибо, @eXXL .

родовое слово

Пример использования:

родовое слово

Я написал метод, который позволяет использовать пустые строки, закомментировать и заключать в кавычки внутри файла.

Примеры:

var1="значение1"
var2= 'значение2'

'var3= закомментировано
; var4= тоже закомментировано

Вот способ:

родовое слово

Еще один ответ (в январе 2018 г.) на старый вопрос (в январе 2009 г.).

Спецификация файла свойств Java описана в JavaDoc файла java.util.Properties.load(java.io.Reader). Одна из проблем заключается в том, что спецификация немного сложнее, чем может быть первое впечатление. Другая проблема заключается в том, что в некоторых ответах здесь произвольно добавлены дополнительные спецификации - например, ; и ' рассматриваются как начало строк комментариев, но не должны. Двойные / одинарные кавычки вокруг значений свойств удаляются, но их не должно быть.

Необходимо учесть следующее.

  1. Есть два типа линий: естественные линии и логические линии .
  2. Естественная строка оканчивается кодом \n, \r, \r\n или концом потока.
  3. Логическая строка может быть распределена по нескольким смежным естественным строкам путем экранирования последовательности терминатора строки с помощью символа обратной косой черты \.
  4. Любые пробелы в начале второй и следующих естественных строк логической строки удаляются.
  5. Пробелы - это пробел (, \u0020), табуляция (\t, \u0009) и фид формы (\f, \u000C).
  6. Как явно указано в спецификации, "недостаточно только проверить символ, предшествующий последовательности ограничителя строки, чтобы решить, экранирован ли ограничитель строки; должно быть нечетное количество смежных обратных косых черт для признака конца строки. так как ввод обрабатывается слева направо, ненулевое четное число 2n смежных обратных косых черт перед символом конца строки (или где-либо еще) кодирует n обратных косых черт после обработки перехода ".
  7. = используется как разделитель между ключом и значением.
  8. : также используется в качестве разделителя между ключом и значением.
  9. Разделитель между ключом и значением можно опустить.
  10. Строка комментария имеет # или ! в качестве первых символов, отличных от пробелов, что означает, что разрешены начальные пробелы перед # или !.
  11. Строка комментария не может быть продлена до следующих естественных строк, даже если ее признаку конца строки предшествует \.
  12. Как явно указано в спецификации, =, : и пробелы могут быть встроены в ключ, если они экранированы обратной косой чертой.
  13. Даже символы конца строки могут быть включены с помощью управляющих последовательностей \r и \n.
  14. Если значение не указано, в качестве значения используется пустая строка.
  15. \uxxxx используется для представления символа Юникода.
  16. Обратная косая черта перед недопустимым escape-символом не считается ошибкой; он беззвучно сбрасывается.

Так, например, если test.properties имеет следующее содержание:

родовое слово

его следует интерпретировать как следующие пары "ключ-значение".

родовое слово

класс PropertiesLoader в пакете NuGet Authlete.Authlete может интерпретировать формат спецификации. Пример кода ниже:

родовое слово

сгенерирует такой вывод:

родовое слово

Эквивалентный пример на Java выглядит следующим образом:

родовое слово

Исходный код, PropertiesLoader.cs, можно найти в authlete-csharp . xUnit тесты для PropertiesLoader написаны на PropertiesLoaderTest.cs.

Да, я знаю, что для этого нет встроенных классов.

Но ведь это не должно быть проблемой?Это выглядит достаточно легко для синтаксического анализа, просто сохраняя результат Stream.ReadToEnd() в строке, разбивая на основе новых строк, а затем разделяя каждую запись на символ =.У вас останется набор пар "ключ-значение", которые можно легко добавить в словарь.

Вот пример, который может сработать для вас:

родовое слово

Вот пример того, как его использовать:

родовое слово

Настоящий ответ - нет (по крайней мере, сам по себе).Вы все равно можете написать свой собственный код для этого.

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

Я не знаю ни одного встроенного способа сделать это.Однако это может показаться достаточно простым, поскольку единственные разделители, о которых вам нужно беспокоиться, - это символ новой строки и знак равенства.

Было бы очень легко написать процедуру, которая будет возвращать NameValueCollection или IDictionary с учетом содержимого файла.

Вы также можете использовать автоматический синтаксис свойств C # со значениями по умолчанию и ограничительным набором.Преимущество здесь в том, что вы можете иметь любой тип данных в вашем «файле» свойств (теперь фактически это класс).Другое преимущество состоит в том, что вы можете использовать синтаксис свойств C # для вызова свойств.Однако вам просто понадобится пара строк для каждого свойства (одна в объявлении свойства и одна в конструкторе), чтобы это сработало.

родовое слово

Для этого существует несколько пакетов NuGet, но все они в настоящее время находятся в предварительной версии.

[Обновить] По состоянию на июнь 2018 г. Capgemini.Cauldron.Core.JavaProperties являетсясейчас в стабильной версии (версии 2.1.0 и 3.0.20).

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

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

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

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

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

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

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

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

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

родовое слово

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top