سؤال

لركض ذاكرة الجميع ، تمتلك Java هذه الملفات بامتداد لـ ".properties" ، والتي هي في الأساس ملف نصي ASCII مليء بأزواج القيمة الرئيسية. يحتوي الإطار على بعض الطرق السهلة حقًا لامتصاص هذا الملف في (بشكل أساسي) hashmap الفاخرة.

المزايا الكبيرة (كما أراها) هي سهولة شديدة في التحرير اليدوية والقراءة/الكتابة.

هل .NET لديها ما يعادل خبز في؟ بالتأكيد ، يمكنني أن أفعل الشيء نفسه مع ملف XML ، لكنني أفضل ألا أضطر إلى كتابة كل هذه الأقواس الزاوية ، إذا كنت تعرف ما أعنيه. أيضًا ، فإن وسيلة لامتصاص جميع البيانات في بنية بيانات في الذاكرة في سطر واحد أمر رائع أيضًا.

(الشريط الجانبي: لا أستطيع أن أصدق أن هذا لم يتم طرحه هنا بالفعل ، لكنني لم أتمكن من العثور على مثل هذا السؤال.)

تعديل:

للإجابة على السؤال الذي ينطوي عليه بعض التعليقات ، لا أبحث عن طريقة لقراءة ملفات Java .Properties على وجه التحديد تحت .NET ، أنا أبحث عن المكافئ الوظيفي في .NET Universe. (وكنت آمل ألا يكون ذلك قائمًا على XML ، بعد أن نسيت أن هذا هو .NET الذي نتحدث عنه.)

وبينما توجد ملفات التكوين قريب, ، أحتاج إلى طريقة لتخزين بعض الأوتار التعسفية ، وليس معلومات تكوين التطبيق ، وبالتالي بدا تركيز ملفات التكوين وتصميمها خارج القاعدة.

هل كانت مفيدة؟

المحلول

يمكنك تحقيق جزء مماثل من الوظائف لخصائص الملفات باستخدام BUTING IN إعدادات الإعدادات (في VS ، أضف "ملف إعدادات" جديد) - لكنه لا يزال يعتمد على XML.

يمكنك الوصول إلى الإعدادات باستخدام فئة الإعدادات التي تم إنشاؤها تلقائيًا ، وحتى تحديثها وحفظها مرة أخرى إلى ملف التكوين - كل ذلك دون كتابة أي من رمز Boilerplate. تعد الإعدادات من النوع القوي ، ويمكن تحديدها على أنها "مستخدم" (يتم حفظها في مجلد بيانات تطبيق المستخدم) أو "التطبيق" (يتم حفظها في نفس المجلد مثل EXE Running).

نصائح أخرى

طريقة .NET هي استخدام أ ملف الضبط. إطار .NET حتى العروضواجهة برمجة تطبيقات للعمل معهم.

يوجد مكون طرف ثالث يسمى 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 هو فارغ أو فارغ ، إنه افتراضي string.Empty.

لم أتمكن من العثور على حل Similer لملف خصائص القراءة باستخدام C#. تمكنت من كتابة رمز خاص باستخدام C# للحصول على نفس النتيجة كما في 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.

لقد كتبت مكتبة تكوين .NET صغيرة تسمى dotnet.config تستخدم ملفات خاصية بسيطة تستند إلى نص مستوحاة من ملفات .property من Java. ويشمل بعض الميزات الرائعة لسهولة التحميل. يمكنك الحصول على نسخة هنا:

https://github.com/jknight/dotnet.config

أنا شخصياً أحب هذا الجزء من الرمز الذي وجدته على الويب. إنها طريقة شخصية للقراءة/الكتابة في ملف الخصائص.

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top