একটি INI ফাইল পড়া / লেখা


263

.NET ফ্রেমওয়ার্কে এমন কোন শ্রেণি রয়েছে যা স্ট্যান্ডার্ড .ini ফাইলগুলি পড়তে / লিখতে পারে:

[Section]
<keyname>=<value>
...

ডেলফির TIniFileউপাদান রয়েছে এবং আমি জানতে চাই যে সি # এর জন্য অনুরূপ কিছু আছে কিনা?


রিমোবজেক্টসের শাইনওন নামে একটি ডেল্ফি প্রিজম লাইব্রেরি রয়েছে যা একই জাতীয় আইএনআই ফাইল শ্রেণীর পাঠায়। তবে আপনার কাছে নেট থেকে নেট তৈরি করার জন্য ডেল্ফি প্রিজম থাকা দরকার কারণ উত্স থেকে এখনও কোনও সংকলিত সমাবেশ উপলব্ধ নেই। কোড.remobjects.com/p/shineon
লেক্স লি

1
একই সমস্যা পেয়েছেন এবং স্টার ফাইল পার্স জন্য আমার নিজের গ্রন্থাগার তৈরি করেছেন: github.com/rickyah/ini-parser হোপ এটা সাহায্য করে
রিকার্ডো Amores

5
রিকির মতোই আমি নিজেই এটির নিজস্ব সমাধান করার সিদ্ধান্ত নিয়েছি। এটি উপলভ্য: github.com/MarioZ/MadMilkman.Ini
মারিও জেড

উত্তর:


185

.NET ফ্রেমওয়ার্কের নির্মাতারা চান আপনি INI ফাইলের পরিবর্তে XML- ভিত্তিক কনফিগারেশন ফাইলগুলি ব্যবহার করুন। সুতরাং না, সেগুলি পড়ার জন্য কোনও বিল্ট-ইন মেকানিজম নেই।

যদিও তৃতীয় পক্ষের সমাধানগুলি উপলব্ধ।


24
যদিও এটি সত্য যে এক্সএমএল কনফিগারেশন ফাইলগুলি যাওয়ার উপায়, এটি এখনও প্রশ্নের উত্তর নয় বা কেবল লিঙ্ক-এর জন্য ভিএলকিউ।
ড্যানি বেকেট

6
@ অ্যালোনগুইড আমি যুক্তি দিয়ে বলব যে উপলব্ধ বৈশিষ্ট্যগুলির বৃহত সেটগুলি .NET কনফিগারেশন ফাইলগুলিতে অবদান রাখে যাতে এগুলিতে প্রচুর যাদু রয়েছে strange তারা "কনফিগার ফাইলে কোড" হয়ে গেছে এবং এর ফলে অনেক জটিলতা, অদ্ভুত আচরণ এবং কনফিগারেশন পরিচালনা আরও কঠিন হয়ে যায়। (আমি আপনার দিকে তাকিয়ে আছি, ডাটাবেস "সরবরাহকারী" এবং সংযোগের স্ট্রিং)) সুতরাং আইএনআই ফাইলগুলি ম্যানুয়াল-সম্পাদনা করার জন্যও সাধারণত ভাল better
jpmc26

1
আমি পুরানো পদ্ধতি (পি / ইনভেকে) পছন্দ করি এবং আপনি পুরাতন পদ্ধতির সাথে ইউনিকোড এর মতো ব্যবহার করতে পারেন: ফাইল.ওয়ারাইটআলবাইটস (পথ, নতুন বাইট [] {0xFF, 0xFE});
sailfish009

2
ভাল প্যাকেজ তবে এটি আরও ভাল হতে পারে। এটি '=' বা '\ n' সম্পূর্ণরূপে এমন কোনও মানকে বিশ্লেষণ করতে পারে না
আহমদ বেহজাতী

211

মুখবন্ধ

প্রথমত, আইএনআই ফাইলের সীমাবদ্ধতার বিষয়ে এই এমএসডিএন ব্লগ পোস্টটি পড়ুন । এটি আপনার প্রয়োজন অনুসারে, পড়ুন।

এটি একটি সংক্ষিপ্ত বাস্তবায়ন যা আমি লিখেছিলাম, মূল উইন্ডোজ পি / ইনভোকটি ব্যবহার করে, তাই এটি উইন্ডোজের সমস্ত সংস্করণ দ্বারা। নেট ইনস্টলড, (যেমন উইন্ডোজ 98 - উইন্ডোজ 10) দ্বারা সমর্থিত। আমি এর দ্বারা এটি সর্বজনীন ডোমেনে প্রকাশ করি - আপনি এট্রিবিউশন ছাড়াই বাণিজ্যিকভাবে এটি ব্যবহার করতে পারেন।

ক্ষুদ্র শ্রেণি

IniFile.csআপনার প্রকল্পে ডাকা একটি নতুন শ্রেণি যুক্ত করুন :

using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;

// Change this to match your program's normal namespace
namespace MyProg
{
    class IniFile   // revision 11
    {
        string Path;
        string EXE = Assembly.GetExecutingAssembly().GetName().Name;

        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);

        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

        public IniFile(string IniPath = null)
        {
            Path = new FileInfo(IniPath ?? EXE + ".ini").FullName;
        }

        public string Read(string Key, string Section = null)
        {
            var RetVal = new StringBuilder(255);
            GetPrivateProfileString(Section ?? EXE, Key, "", RetVal, 255, Path);
            return RetVal.ToString();
        }

        public void Write(string Key, string Value, string Section = null)
        {
            WritePrivateProfileString(Section ?? EXE, Key, Value, Path);
        }

        public void DeleteKey(string Key, string Section = null)
        {
            Write(Key, null, Section ?? EXE);
        }

        public void DeleteSection(string Section = null)
        {
            Write(null, null, Section ?? EXE);
        }

        public bool KeyExists(string Key, string Section = null)
        {
            return Read(Key, Section).Length > 0;
        }
    }
}

এটি কিভাবে ব্যবহার করতে

নিম্নলিখিত 3 টির মধ্যে একটিতে INI ফাইলটি খুলুন:

// Creates or loads an INI file in the same directory as your executable
// named EXE.ini (where EXE is the name of your executable)
var MyIni = new IniFile();

// Or specify a specific name in the current dir
var MyIni = new IniFile("Settings.ini");

// Or specify a specific name in a specific dir
var MyIni = new IniFile(@"C:\Settings.ini");

আপনি কিছু মান লিখতে পারেন:

MyIni.Write("DefaultVolume", "100");
MyIni.Write("HomePage", "http://www.google.com");

এটির মতো একটি ফাইল তৈরি করতে:

[MyProg]
DefaultVolume=100
HomePage=http://www.google.com

আইএনআই ফাইলের বাইরে মানগুলি পড়তে:

var DefaultVolume = IniFile.Read("DefaultVolume");
var HomePage = IniFile.Read("HomePage");

Allyচ্ছিকভাবে, আপনি এর সেট করতে পারেন [Section]:

MyIni.Write("DefaultVolume", "100", "Audio");
MyIni.Write("HomePage", "http://www.google.com", "Web");

এটির মতো একটি ফাইল তৈরি করতে:

[Audio]
DefaultVolume=100

[Web]
HomePage=http://www.google.com

আপনি এর মতো কীটির অস্তিত্ব পরীক্ষা করতে পারেন:

if(!MyIni.KeyExists("DefaultVolume", "Audio"))
{
    MyIni.Write("DefaultVolume", "100", "Audio");
}

আপনি এর মতো একটি কী মুছতে পারেন:

MyIni.DeleteKey("DefaultVolume", "Audio");

আপনি এর মতো একটি সম্পূর্ণ বিভাগ (সমস্ত কী সহ) মুছতে পারেন:

MyIni.DeleteSection("Web");

যেকোন উন্নতির সাথে নির্দ্বিধায় মন্তব্য করুন!


4
আমি কিছুটা দেরি করে ফেলেছি, তবে এটি GetSections()পদ্ধতি অনুপস্থিত ।
Stil

2
হয়তো আরো একটি ঐতিহ্যগত ডিফল্ট প্রতি অ্যাপ্লিকেশন (প্রতি সমাবেশ নয়) মত .ini ফাইল হবে Path.GetFullPath(IniPath ?? Path.ChangeExtension(Application.ExecutablePath, ".ini"))
ইউজিন রায়বতসেভ

3
সত্যিই চমৎকার ! গিথুব লাগিয়েছি?
এমরিস মাইরোইন

2
@ উদ্যান বিকেট, সুন্দরভাবে সম্পন্ন হয়েছে। এটি প্রায় ঠিক একইরকম যা আমি গত উম-বছর ধরে ব্যবহার করেছি নেট। বছর পূর্বে পুরানো কোড থেকে আপগ্রেড হয়েছে।
দামিয়ান

10
এখন পুরানো, এবং যতটা আমি রেমন্ড চেনকে শ্রদ্ধা করি, সেই নিবন্ধটির অনেকগুলি সীমাবদ্ধতা ছিল উইন্ডোজের নির্দিষ্ট আইএনআই লাইব্রেরির সীমাবদ্ধতা, এবং নিজেই আইএনআই ফর্ম্যাট নয়। অন্য, দানাদার অনুমতি মত, সহজেই একাধিক ফাইলের মাধ্যমে পার্শ্ববর্তী করা যেতে পারে। একটি সরকারী , আধুনিকীকরণ INI এ গ্রন্থাগার সর্বাধিক স্বাগত হবে আজও।
জোয়েল কোহর্ন

68

কোডপ্রজেক্ট " এই আইএনআই ফাইল হ্যান্ডলিং ক্লাস সি # " ব্যবহার করে এই নিবন্ধটি সহায়তা করা উচিত।

লেখক একটি সি # ক্লাস "আইএনআই" তৈরি করেছেন যা KERNEL32.dll থেকে দুটি ফাংশন প্রকাশ করে। এই ফাংশনগুলি: WritePrivateProfileStringএবং GetPrivateProfileString। আপনার দুটি নামস্থান প্রয়োজন হবে: System.Runtime.InteropServicesএবং System.Text

ইনি ক্লাসটি ব্যবহারের পদক্ষেপ

আপনার প্রকল্পের নেমস্পেস সংজ্ঞা যুক্ত করুন

using INI;

এটির মতো একটি INIFile তৈরি করুন

INIFile ini = new INIFile("C:\\test.ini");

IniWriteValueকোনও বিভাগে একটি নির্দিষ্ট কীতে একটি নতুন মান লিখতে ব্যবহার করুন বা IniReadValueএকটি নির্দিষ্ট বিভাগে একটি কী থেকে একটি মান পড়তে ব্যবহার করুন ।

দ্রষ্টব্য: আপনি যদি স্ক্র্যাচ থেকে শুরু করেন তবে আপনি এই এমএসডিএন নিবন্ধটি পড়তে পারেন : কীভাবে: সি # প্রকল্পগুলিতে অ্যাপ্লিকেশন কনফিগারেশন ফাইল যুক্ত করুন । এটি আপনার অ্যাপ্লিকেশনটি কনফিগার করার জন্য আরও ভাল উপায়।


1
আমি সম্পূর্ণ INI ফাইলটি পড়তে চাই। বিভাগটি পড়ার পরিবর্তে কী কীভাবে করা যায়, কী
ভেঙ্কট

এটি আমার পক্ষে কাজ করেছিল এবং তারপরে অন্য বিষয় থেকে কাজ করা বন্ধ করে দিয়েছে। হুডের অধীনে কী আলাদা হয়েছে তা এখনও কোনও ধারণা নেই
নওফাল

1
এই অবচয়যুক্ত Win32 এপিআই ফাংশনগুলি ব্যবহার করে দেখুন। আরো তথ্য: stackoverflow.com/questions/11451641/...
Pedro77

আমি এই পদ্ধতির জন্য কিছুক্ষণ ব্যবহার করেছি, তবে উইন 7-তে শুরু হওয়া সুরক্ষা বর্ধনগুলি আমার পক্ষে এটিকে অনেক বেশি মেরেছে। আপনি এখনও এই পদ্ধতির ব্যবহার করতে পারেন, তবে আপনার কাছে প্রোগ্রাম। ডেটাতে .ini সঞ্চয় করতে হবে এবং সেখানে আপনার অ্যাপটি পড়তে / লিখতে হবে।
জেস

প্রোগ্রামডাটাতে অ্যাপ্লিকেশন কনফিগারেশন ini ফাইলগুলি সংরক্ষণ করবেন না। এগুলি রেজিস্ট্রি বা প্রোগ্রামডাটাতে অন্তর্ভুক্ত নয়। কনফিগার ফাইলগুলি লোকাল অ্যাপ্লিকেশনডেটা ফোল্ডারগুলিতে থাকার কথা।
Deegee

47

আমি এই সাধারণ প্রয়োগটি পেয়েছি:

http://bytes.com/topic/net/insights/797169-reading-parsing-ini-file-c

আমার যা প্রয়োজন তার জন্য ভাল কাজ করে।

আপনি এটি কীভাবে ব্যবহার করবেন তা এখানে:

public class TestParser
{
    public static void Main()
    {
        IniParser parser = new IniParser(@"C:\test.ini");

        String newMessage;

        newMessage = parser.GetSetting("appsettings", "msgpart1");
        newMessage += parser.GetSetting("appsettings", "msgpart2");
        newMessage += parser.GetSetting("punctuation", "ex");

        //Returns "Hello World!"
        Console.WriteLine(newMessage);
        Console.ReadLine();
    }
}

কোডটি এখানে:

using System;
using System.IO;
using System.Collections;

public class IniParser
{
    private Hashtable keyPairs = new Hashtable();
    private String iniFilePath;

    private struct SectionPair
    {
        public String Section;
        public String Key;
    }

    /// <summary>
    /// Opens the INI file at the given path and enumerates the values in the IniParser.
    /// </summary>
    /// <param name="iniPath">Full path to INI file.</param>
    public IniParser(String iniPath)
    {
        TextReader iniFile = null;
        String strLine = null;
        String currentRoot = null;
        String[] keyPair = null;

        iniFilePath = iniPath;

        if (File.Exists(iniPath))
        {
            try
            {
                iniFile = new StreamReader(iniPath);

                strLine = iniFile.ReadLine();

                while (strLine != null)
                {
                    strLine = strLine.Trim().ToUpper();

                    if (strLine != "")
                    {
                        if (strLine.StartsWith("[") && strLine.EndsWith("]"))
                        {
                            currentRoot = strLine.Substring(1, strLine.Length - 2);
                        }
                        else
                        {
                            keyPair = strLine.Split(new char[] { '=' }, 2);

                            SectionPair sectionPair;
                            String value = null;

                            if (currentRoot == null)
                                currentRoot = "ROOT";

                            sectionPair.Section = currentRoot;
                            sectionPair.Key = keyPair[0];

                            if (keyPair.Length > 1)
                                value = keyPair[1];

                            keyPairs.Add(sectionPair, value);
                        }
                    }

                    strLine = iniFile.ReadLine();
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (iniFile != null)
                    iniFile.Close();
            }
        }
        else
            throw new FileNotFoundException("Unable to locate " + iniPath);

    }

    /// <summary>
    /// Returns the value for the given section, key pair.
    /// </summary>
    /// <param name="sectionName">Section name.</param>
    /// <param name="settingName">Key name.</param>
    public String GetSetting(String sectionName, String settingName)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();

        return (String)keyPairs[sectionPair];
    }

    /// <summary>
    /// Enumerates all lines for given section.
    /// </summary>
    /// <param name="sectionName">Section to enum.</param>
    public String[] EnumSection(String sectionName)
    {
        ArrayList tmpArray = new ArrayList();

        foreach (SectionPair pair in keyPairs.Keys)
        {
            if (pair.Section == sectionName.ToUpper())
                tmpArray.Add(pair.Key);
        }

        return (String[])tmpArray.ToArray(typeof(String));
    }

    /// <summary>
    /// Adds or replaces a setting to the table to be saved.
    /// </summary>
    /// <param name="sectionName">Section to add under.</param>
    /// <param name="settingName">Key name to add.</param>
    /// <param name="settingValue">Value of key.</param>
    public void AddSetting(String sectionName, String settingName, String settingValue)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();

        if (keyPairs.ContainsKey(sectionPair))
            keyPairs.Remove(sectionPair);

        keyPairs.Add(sectionPair, settingValue);
    }

    /// <summary>
    /// Adds or replaces a setting to the table to be saved with a null value.
    /// </summary>
    /// <param name="sectionName">Section to add under.</param>
    /// <param name="settingName">Key name to add.</param>
    public void AddSetting(String sectionName, String settingName)
    {
        AddSetting(sectionName, settingName, null);
    }

    /// <summary>
    /// Remove a setting.
    /// </summary>
    /// <param name="sectionName">Section to add under.</param>
    /// <param name="settingName">Key name to add.</param>
    public void DeleteSetting(String sectionName, String settingName)
    {
        SectionPair sectionPair;
        sectionPair.Section = sectionName.ToUpper();
        sectionPair.Key = settingName.ToUpper();

        if (keyPairs.ContainsKey(sectionPair))
            keyPairs.Remove(sectionPair);
    }

    /// <summary>
    /// Save settings to new file.
    /// </summary>
    /// <param name="newFilePath">New file path.</param>
    public void SaveSettings(String newFilePath)
    {
        ArrayList sections = new ArrayList();
        String tmpValue = "";
        String strToSave = "";

        foreach (SectionPair sectionPair in keyPairs.Keys)
        {
            if (!sections.Contains(sectionPair.Section))
                sections.Add(sectionPair.Section);
        }

        foreach (String section in sections)
        {
            strToSave += ("[" + section + "]\r\n");

            foreach (SectionPair sectionPair in keyPairs.Keys)
            {
                if (sectionPair.Section == section)
                {
                    tmpValue = (String)keyPairs[sectionPair];

                    if (tmpValue != null)
                        tmpValue = "=" + tmpValue;

                    strToSave += (sectionPair.Key + tmpValue + "\r\n");
                }
            }

            strToSave += "\r\n";
        }

        try
        {
            TextWriter tw = new StreamWriter(newFilePath);
            tw.Write(strToSave);
            tw.Close();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// Save settings back to ini file.
    /// </summary>
    public void SaveSettings()
    {
        SaveSettings(iniFilePath);
    }
}

38
ডাউনওয়োটের উপরে অফসেট করতে +1। আপনি আসলে কি সম্পর্কে অভিযোগ করবেন? তিনি বলেছেন যে তিনি এটি দেখতে পান। জেনেরিক অ্যাকসেসর এবং স্ট্রিংবিল্ডার ব্যবহারের জন্য কোনও খুঁজে না পাওয়ায় আপনি কি তাকে নিম্নচাষে ফেলেছেন?
টর্মোড

1
@ টারমোড: আশা করি আমি মন্তব্যটি নীচে নামাতে পারতাম। যখন আমরা সমাধানগুলিতে ভোট দেই তখন এটি একটি প্রযুক্তিগত ফোরাম হয় (স্পষ্টত ইতিবাচক) অভিপ্রায়টি নয়। নূথের নিজের দ্বারা পোস্ট করা কোনও সমাধানে যদি ত্রুটি থাকে তবে তা - এবং হওয়া উচিত -। সমাধান পোস্টারটি খুঁজে পেয়েছে বা লিখিত হয়েছিল তা বিবেচ্য নয়।
ya23

7
আমি মনে করি আপনি "ত্রুটি" এর সংজ্ঞাটি প্রসারিত করুন। যদি সমাধানটি আপনার সংবেদনশীলতাগুলিকে গুরুত্ব দেয় না, তবে কেবল উত্সাহিত করবেন না। আমি কেবল একটি নোট রেখেছিলাম যে আমি ইতিমধ্যে তাঁর ডাউনটোটকে অস্বীকার করেছি যাতে অন্য 7 জন ব্যক্তি যারা আমার মন্তব্যকে সমর্থন করেছেন তারা নিজেরাই এটি না করে।
টর্মোড

21

জয়ারেজের উত্তরের কোডটি অনুপ্রেরণামূলক।

দুর্ভাগ্যক্রমে, এটি কীগুলির চরিত্রের আবরণ পরিবর্তন করে এবং মন্তব্যগুলি পরিচালনা করে না। সুতরাং আমি এমন কিছু লিখেছিলাম যা খুব নোংরা আইএনআই ফাইলগুলি পড়ার জন্য যথেষ্ট শক্তিশালী হওয়া উচিত এবং কীগুলি সেগুলি পুনরুদ্ধার করার অনুমতি দেয়।

এটি বিভাগ, কী এবং মান সংরক্ষণ করতে এবং একসাথে ফাইলটি পড়তে কিছু লিনকিউ, একটি নেস্টেড কেস সংবেদনশীল স্ট্রিং অভিধান ব্যবহার করে।

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

class IniReader
{
    Dictionary<string, Dictionary<string, string>> ini = new Dictionary<string, Dictionary<string, string>>(StringComparer.InvariantCultureIgnoreCase);

    public IniReader(string file)
    {
        var txt = File.ReadAllText(file);

        Dictionary<string, string> currentSection = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);

        ini[""] = currentSection;

        foreach(var line in txt.Split(new[]{"\n"}, StringSplitOptions.RemoveEmptyEntries)
                               .Where(t => !string.IsNullOrWhiteSpace(t))
                               .Select(t => t.Trim()))
        {
            if (line.StartsWith(";"))
                continue;

            if (line.StartsWith("[") && line.EndsWith("]"))
            {
                currentSection = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
                ini[line.Substring(1, line.LastIndexOf("]") - 1)] = currentSection;
                continue;
            }

            var idx = line.IndexOf("=");
            if (idx == -1)
                currentSection[line] = "";
            else
                currentSection[line.Substring(0, idx)] = line.Substring(idx + 1);
        }
    }

    public string GetValue(string key)
    {
        return GetValue(key, "", "");
    }

    public string GetValue(string key, string section)
    {
        return GetValue(key, section, "");
    }

    public string GetValue(string key, string section, string @default)
    {
        if (!ini.ContainsKey(section))
            return @default;

        if (!ini[section].ContainsKey(key))
            return @default;

        return ini[section][key];
    }

    public string[] GetKeys(string section)
    {
        if (!ini.ContainsKey(section))
            return new string[0];

        return ini[section].Keys.ToArray();
    }

    public string[] GetSections()
    {
        return ini.Keys.Where(t => t != "").ToArray();
    }
}

4
এবং catch (Exception ex) { throw ex; }এটি সেখানে না দেওয়ার জন্য আপনাকে ধন্যবাদ
মার্ক শুলথিস

1
ভাল! আরও ভালভাবে কাজ করার জন্য কিছু পরিবর্তন প্রয়োজন। লাইন 16: ini [""] = কারেন্টসেকশন; থেকে: // ini [""] = কারেন্টসেকশন; এটি প্রতিবারের মতো প্রথম বারের উপাদান [0] খালি খণ্ড হয়ে যাবে কারণ এই আরম্ভের কারণে এটি অবশ্যই মুছে ফেলা উচিত। লাইন 36: কারেন্টসেকশন [line.Substring (0, idx)] = line.Substring (idx + 1); প্রতি: কারেন্টসেকশন [লাইন.সুবস্ট্রিং (0, আইডিএক্স)। ট্রিম ()] = লাইন.সুবস্ট্রিং (আইডিএক্স + 1)। ট্রিম (); কী এবং মানগুলি স্বাধীনভাবে ছাঁটাই করা উচিত, কেবল ট্রিম লাইনে নয়। আইএনআই-তে কনফিগারেশন ফাইলের মতো সাধারণত কে-> ভি জোড়া যুক্ত করে বিভাগগুলির অভ্যন্তরে এই সমান সারিবদ্ধ থাকে। ধন্যবাদ!
এলএক্সসফট

আমরা দীর্ঘ। আপনার পরামর্শের জন্য অনেক ধন্যবাদ। তারা সবাই বোঝায় এবং একটি ভাল রিফ্রেশ পেতে এই কোডটির প্রাপ্য।
ল্যারি

13

আমি সম্পূর্ণভাবে সি # তে তৈরি একটি ইনিপার্সার লাইব্রেরিটি চালু করতে চাই, সুতরাং এতে কোনও ওএসে কোনও নির্ভরতা নেই, যা এটি মনোকে সামঞ্জস্যপূর্ণ করে তোলে। এমআইটি লাইসেন্স সহ ওপেন সোর্স - এটি কোনও কোডেই ব্যবহার করা যেতে পারে।

আপনি গিটহাবের উত্সটি পরীক্ষা করে দেখতে পারেন এবং এটি নুগেট প্যাকেজ হিসাবেও উপলব্ধ

এটি ভারিভাবে কনফিগারযোগ্য এবং ব্যবহারের পক্ষে সত্যই সহজ

নির্লজ্জ প্লাগের জন্য দুঃখিত তবে আমি আশা করি এটি উত্তরটি পুনর্বিবেচনা করা কারওর পক্ষে সহায়ক হতে পারে।


4

আপনার যদি কেবল পঠিত অ্যাক্সেসের প্রয়োজন হয় এবং লেখার অ্যাক্সেসের প্রয়োজন নেই এবং আপনি Microsoft.Extensions.Confiuration(এএসপি.নেট কোর দিয়ে ডিফল্টরূপে বান্ডিল হয়ে পড়েছেন তবে নিয়মিত প্রোগ্রামগুলির সাথেও কাজ করে) আপনি Microsoft.Extensions.Configuration.Iniনিজের কনফিগারেশন সেটিংসে ইনআই ফাইলগুলি আমদানি করতে নিউগেট প্যাকেজটি ব্যবহার করতে পারেন ।

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddIniFile("SomeConfig.ini", optional: false);
    Configuration = builder.Build();
}

কেবল যোগ করার জন্য আপনি তারপরে কীগুলি পানConfiguration["keyname"]
কোফিফাস

অ্যাপটি চলাকালীন আইআইএস এটি স্বীকৃতি দেয় না এমন কারণেই আমার যে সমস্যাটি রয়েছে তা বন্ধ করুন। এটি স্থাপন করা হয়েছে, এবং সেখানে, কিন্তু গ্রাস করা হচ্ছে না। এইচটিটিপি 500.30 ফিরে এসেছে এবং আইআইএস অ্যাপ লগতে "কনফিগারেশন ফাইলটি পাওয়া যায় নি এবং এটি alচ্ছিক নয়।"
one.beat.consumer

3

সাধারণত, আপনি যখন সি # এবং .NET ফ্রেমওয়ার্ক ব্যবহার করে অ্যাপ্লিকেশন তৈরি করেন, আপনি INI ফাইল ব্যবহার করবেন না। এক্সএমএল-ভিত্তিক কনফিগারেশন ফাইল বা রেজিস্ট্রিতে সেটিংস সঞ্চয় করা বেশি সাধারণ। তবে, যদি আপনার সফ্টওয়্যারটি কোনও উত্তরাধিকার অ্যাপ্লিকেশনটির সাথে সেটিংস ভাগ করে দেয় তবে অন্য কোথাও তথ্যের নকল না করে এর কনফিগারেশন ফাইলটি ব্যবহার করা আরও সহজ হতে পারে।

.NET ফ্রেমওয়ার্কটি সরাসরি INI ফাইলগুলির ব্যবহার সমর্থন করে না। তবে আপনি ফাইলগুলি থেকে লিখতে এবং পড়তে প্ল্যাটফর্ম ইনভোকেশন সার্ভিসেস (পি / ইনভোক) এর সাথে উইন্ডোজ এপিআই ফাংশন ব্যবহার করতে পারেন। এই লিঙ্কে আমরা একটি শ্রেণি তৈরি করি যা INI ফাইলগুলিকে উপস্থাপন করে এবং সেগুলি পরিচালনা করতে উইন্ডোজ এপিআই ফাংশন ব্যবহার করে। দয়া করে নীচের লিঙ্কটি দিয়ে যান।

INI ফাইলগুলি পড়া এবং লেখা


4
রেজিস্ট্রি থেকে দূরে থাক! অ্যাপ্লিকেশন কনফিগারেশন ডেটা রেজিস্ট্রি সংরক্ষণ করা উচিত নয়।
Deegee

3

আপনি যদি এখানে বিভাগ এবং অন্য কোনও ঘর ছাড়া কেবল একটি সাধারণ পাঠক চান তবে এটি সহজ সমাধান:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tool
{
    public class Config
    {
        Dictionary <string, string> values;
        public Config (string path)
        {
            values = File.ReadLines(path)
            .Where(line => (!String.IsNullOrWhiteSpace(line) && !line.StartsWith("#")))
            .Select(line => line.Split(new char[] { '=' }, 2, 0))
            .ToDictionary(parts => parts[0].Trim(), parts => parts.Length>1?parts[1].Trim():null);
        }
        public string Value (string name, string value=null)
        {
            if (values!=null && values.ContainsKey(name))
            {
                return values[name];
            }
            return value;
        }
    }
}

ব্যবহারের নমুনা:

    file = new Tool.Config (Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\config.ini");
    command = file.Value ("command");
    action = file.Value ("action");
    string value;
    //second parameter is default value if no key found with this name
    value = file.Value("debug","true");
    this.debug = (value.ToLower()=="true" || value== "1");
    value = file.Value("plain", "false");
    this.plain = (value.ToLower() == "true" || value == "1");

এর মধ্যে ফাইলের সামগ্রী কনফিগার করুন (যেমন আপনি দেখতে পাচ্ছেন লাইন মন্তব্যের জন্য # প্রতীককে সমর্থন করে):

#command to run
command = php

#default script
action = index.php

#debug mode
#debug = true

#plain text mode
#plain = false

#icon = favico.ico

3

এই পদ্ধতিটি ব্যবহার করে দেখুন:

public static Dictionary<string, string> ParseIniDataWithSections(string[] iniData)
{
    var dict = new Dictionary<string, string>();
    var rows = iniData.Where(t => 
        !String.IsNullOrEmpty(t.Trim()) && !t.StartsWith(";") && (t.Contains('[') || t.Contains('=')));
    if (rows == null || rows.Count() == 0) return dict;
    string section = "";
    foreach (string row in rows)
    {
        string rw = row.TrimStart();
        if (rw.StartsWith("["))
            section = rw.TrimStart('[').TrimEnd(']');
        else
        {
            int index = rw.IndexOf('=');
            dict[section + "-" + rw.Substring(0, index).Trim()] = rw.Substring(index+1).Trim().Trim('"');
        }
    }
    return dict;
}

এটি অভিধান তৈরি করে যেখানে কীটি "-" থাকে। আপনি এটি এর মতো লোড করতে পারেন:

var dict = ParseIniDataWithSections(File.ReadAllLines(fileName));

3

পিএনটবুটার.আইএনআই হ'ল আইএনআই ফাইল ম্যানিপুলেশনের জন্য একটি নুগেট-প্যাকেজযুক্ত ক্লাস। এটি মন্তব্য সহ পঠন / লেখার সমর্থন করে - আপনার মন্তব্য লেখায় সংরক্ষিত। এটি যুক্তিসঙ্গতভাবে জনপ্রিয় বলে মনে হচ্ছে, এটি পরীক্ষিত এবং ব্যবহার করা সহজ। এটি সম্পূর্ণ নিখরচায় ও মুক্ত উত্সও।

দাবি অস্বীকার: আমি পিনাটবাটার.আইএনআই এর লেখক।


আপনি কি দয়া করে চিনাবাদাম বাটরের একটি লিঙ্ক সরবরাহ করতে পারেন? আইএনআই ডকুমেন্টেশন?
শ্রোমবেকার

1
পরীক্ষা করে দেখুন github.com/fluffynuts/PeanutButter/blob/master/source/INI/...
DAF

3

আমি দলে যোগ দিতে দেরি করেছি, তবে আমার আজ একই সমস্যা ছিল এবং আমি নিম্নলিখিত প্রয়োগটি লিখেছি:

using System.Text.RegularExpressions;

static bool match(this string str, string pat, out Match m) =>
    (m = Regex.Match(str, pat, RegexOptions.IgnoreCase)).Success;

static void Main()
{
    Dictionary<string, Dictionary<string, string>> ini = new Dictionary<string, Dictionary<string, string>>();
    string section = "";

    foreach (string line in File.ReadAllLines(.........)) // read from file
    {
        string ln = (line.Contains('#') ? line.Remove(line.IndexOf('#')) : line).Trim();

        if (ln.match(@"^[ \t]*\[(?<sec>[\w\-]+)\]", out Match m))
            section = m.Groups["sec"].ToString();
        else if (ln.match(@"^[ \t]*(?<prop>[\w\-]+)\=(?<val>.*)", out m))
        {
            if (!ini.ContainsKey(section))
                ini[section] = new Dictionary<string, string>();

            ini[section][m.Groups["prop"].ToString()] = m.Groups["val"].ToString();
        }
    }


    // access the ini file as follows:
    string content = ini["section"]["property"];
}

এটি অবশ্যই লক্ষ করা উচিত, যে এই বাস্তবায়নটি এমন অংশ বা বৈশিষ্ট্যগুলি হ্যান্ডেল করে না যা পাওয়া যায় নি। এটি অর্জনের জন্য, আপনার Dictionary<,>ভিত্তিহীন কীগুলি হ্যান্ডেল করার জন্য ক্লাসটি প্রসারিত করা উচিত ।


এর একটি দৃষ্টান্ত ধারাবাহিকভাবে করার Dictionary<string, Dictionary<string, string>>একটি থেকে .ini-file, আমি নিম্নলিখিত কোড ব্যবহার করুন:

string targetpath = .........;
Dictionary<string, Dictionary<string, string>> ini = ........;
StringBuilder sb = new StringBuilder();

foreach (string section in ini.Keys)
{
    sb.AppendLine($"[{section}]");

    foreach (string property in ini[section].Keys)
        sb.AppendLine($"{property}={ini[section][property]");
}

File.WriteAllText(targetpath, sb.ToString());

2

কমনলিবারি.এনইটি- তে একটি আইএন পার্সার উপলব্ধ

বিভাগ / মানগুলি পাওয়ার জন্য এটিতে অনেকগুলি সুবিধাজনক ওভারলোড রয়েছে এবং এটি খুব হালকা ওজন।


1
যদি এটি গ্রন্থাগারের শীর্ষ স্তরের দিকে তাকানো থেকে স্পষ্ট না হয় (এটি আমার কাছে সুস্পষ্ট ছিল না!), ইনডিডকামেন্ট ক্লাস এবং আল কমলিব.আইও-তে রয়েছে।
টিম কেটিং

2
এই রুটের দিকে নজর দেওয়া যে কারও জন্য, কমনলিবারি.এনইটি .INI সম্মেলনগুলি অনুসরণ করবে বলে মনে হয় না। এটি সমান চিহ্নের পরিবর্তে ডিলিমিটার হিসাবে একটি কোলন ":" ব্যবহার করে এবং এটি কোনও মন্তব্য হ্যান্ডেল করে না (একটি অর্ধ-কোলন বা পাউন্ড সাইন দিয়ে একটি লাইন শুরু করলে পার্সিং ব্যর্থ হয়)।
jmmr

2

নিয়মিত এক্সপ্রেশন ব্যবহার করে এখানে আমার নিজস্ব সংস্করণ। এই কোডটি ধরে নিয়েছে যে প্রতিটি বিভাগের নামটি অনন্য however তবে যদি এটি সত্য না হয় - এটি অভিধানের সাথে তালিকার সাথে প্রতিস্থাপন করা অর্থপূর্ণ হয়। এই ফাংশন ';' থেকে শুরু করে .ini ফাইল মন্তব্যকে সমর্থন করে; অক্ষর। বিভাগটি সাধারণত [বিভাগ] থেকে শুরু হয় এবং মূল মান জোড়গুলিও সাধারণত "কী = মান" আসে। বিভাগগুলির জন্য একই ধারণা - মূল নামটি অনন্য।

/// <summary>
/// Loads .ini file into dictionary.
/// </summary>
public static Dictionary<String, Dictionary<String, String>> loadIni(String file)
{
    Dictionary<String, Dictionary<String, String>> d = new Dictionary<string, Dictionary<string, string>>();

    String ini = File.ReadAllText(file);

    // Remove comments, preserve linefeeds, if end-user needs to count line number.
    ini = Regex.Replace(ini, @"^\s*;.*$", "", RegexOptions.Multiline);

    // Pick up all lines from first section to another section
    foreach (Match m in Regex.Matches(ini, "(^|[\r\n])\\[([^\r\n]*)\\][\r\n]+(.*?)(\\[([^\r\n]*)\\][\r\n]+|$)", RegexOptions.Singleline))
    {
        String sectionName = m.Groups[2].Value;
        Dictionary<String, String> lines = new Dictionary<String, String>();

        // Pick up "key = value" kind of syntax.
        foreach (Match l in Regex.Matches(ini, @"^\s*(.*?)\s*=\s*(.*?)\s*$", RegexOptions.Multiline))
        {
            String key = l.Groups[1].Value;
            String value = l.Groups[2].Value;

            // Open up quotation if any.
            value = Regex.Replace(value, "^\"(.*)\"$", "$1");

            if (!lines.ContainsKey(key))
                lines[key] = value;
        }

        if (!d.ContainsKey(sectionName))
            d[sectionName] = lines;
    }

    return d;
}

এই ফাংশনটি আমার পক্ষে কাজ করে না: এটি দুটি বিভাগে একটি অংশ ভুলে যায়। আমি [বিভাগ] এর আগে খালি লাইনগুলি দিয়ে এবং ছাড়া চেষ্টা করেছি।
iksess

আপনি কি আপনার .ini উদাহরণটি অনুলিপি করতে পারেন যা কাজ করে না?
টারমোপিকারো

-3

এখানে আমার ক্লাস, মনোহর মত কাজ করে:

public static class IniFileManager
{


    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string section,
        string key, string val, string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section,
             string key, string def, StringBuilder retVal,
        int size, string filePath);
    [DllImport("kernel32.dll")]
    private static extern int GetPrivateProfileSection(string lpAppName,
             byte[] lpszReturnBuffer, int nSize, string lpFileName);


    /// <summary>
    /// Write Data to the INI File
    /// </summary>
    /// <PARAM name="Section"></PARAM>
    /// Section name
    /// <PARAM name="Key"></PARAM>
    /// Key Name
    /// <PARAM name="Value"></PARAM>
    /// Value Name
    public static void IniWriteValue(string sPath,string Section, string Key, string Value)
    {
        WritePrivateProfileString(Section, Key, Value, sPath);
    }

    /// <summary>
    /// Read Data Value From the Ini File
    /// </summary>
    /// <PARAM name="Section"></PARAM>
    /// <PARAM name="Key"></PARAM>
    /// <PARAM name="Path"></PARAM>
    /// <returns></returns>
    public static string IniReadValue(string sPath,string Section, string Key)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(Section, Key, "", temp,
                                        255, sPath);
        return temp.ToString();

    }

}

ব্যবহারটি অবিচলিত হওয়ায় এটি একটি স্ট্যাটিক শ্রেণি, কেবল একটি বিভাগ পড়ার জন্য IniFileManager.IniWriteValue বা একটি বিভাগ পড়ার জন্য IniFileManager.IniReadValue কল করুন।


এই পদ্ধতির ইতিমধ্যে অন্য উত্তরে প্রদর্শিত এবং ব্যাখ্যা করা হয়েছে । আপনার উত্তরটি কী যুক্ত করে যা এটির আওতায় নেই?
প্লেক

সাবধান হোন যে শুধুমাত্র .ini ফাইলটি ইউনিকোডে (16 বিট এলইএ) সংরক্ষণ করা হলে এটি কাজ করে। পাঠ্যটিকে ইউনিকোডে রূপান্তর করতে নোটপ্যাড ++ ব্যবহার করুন, কারণ আপনি যদি এটি ইউটিএফ -8 এ সংরক্ষণ করেন তবে এটি কাজ করবে না। এছাড়াও এএনএসআই গ্রহণযোগ্য, তবে আপনি
উচ্চারণযুক্ত

-6

আপনি এক্সএমএল ফাইলগুলি থেকে ডেটা পড়তে এবং লিখতে হবে যেহেতু আপনি একটি সম্পূর্ণ বস্তুটি এক্সএমএলে সংরক্ষণ করতে পারেন এবং আপনি কোনও সংরক্ষিত এক্সএমএল থেকে কোনও বস্তু পপুলেট করতে পারেন। অবজেক্টগুলি ম্যানিপুলেট করা এটি আরও ভাল।

এটি কীভাবে করবেন তা এখানে রয়েছে: একটি এক্সএমএল ফাইলটিতে অবজেক্ট ডেটা লিখুন: https : //msdn.mic Microsoft.com/en-us/library/ms172873.aspx একটি এক্সএমএল ফাইল থেকে অবজেক্ট ডেটা পড়ুন: https://msdn.microsoft। কম / en-US / লাইব্রেরি / ms172872.aspx


1
বাহ্যিক সংস্থানগুলিতে লিঙ্কগুলি উত্সাহিত করা হয় তবে দয়া করে লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের এটি কী এবং কেন আছে তা কিছুটা ধারণা থাকতে পারে। টার্গেট সাইটটি যদি অ্যাক্সেসযোগ্য না হয় বা স্থায়ীভাবে অফলাইনে চলে যায় তবে সর্বদা গুরুত্বপূর্ণ লিঙ্কের সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন।
ডেভেজাল

আমি বিশ্বাস করি যে লিঙ্কগুলির শিরোনামগুলি এর উল্লেখ / প্রসঙ্গে খুব স্পষ্ট। আপনি যদি ভাবেন যে এটি সম্পাদনা করতে যথেষ্ট দ্বিধা বোধ করবেন না।
ড্যানিয়েল

1
আসল প্রশ্নটি সম্বোধন করে না।
এরিক নোলস 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.