উইন্ডোজ ফর্ম অ্যাপ্লিকেশনটিতে আমি কীভাবে অ্যাপ্লিকেশন সেটিংস সংরক্ষণ করতে পারি?


581

আমি যা অর্জন করতে চাই তা খুব সহজ: আমার কাছে একটি উইন্ডোজ ফর্ম (.NET 3.5) অ্যাপ্লিকেশন রয়েছে যা তথ্য পড়ার জন্য একটি পথ ব্যবহার করে। এই পথটি আমি সরবরাহকারী বিকল্প ফর্মটি ব্যবহার করে ব্যবহারকারী দ্বারা পরিবর্তন করা যেতে পারে।

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

আমি বুঝতে পারি যে তিনটি বিকল্প উপলব্ধ:

  • কনফিগারেশনসেটেটিং ফাইল (appname.exe.config)
  • রেজিস্ট্রি
  • কাস্টম এক্সএমএল ফাইল

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

এর অর্থ কি কনফিগারেশন সেটিংস সংরক্ষণ করতে আমার একটি কাস্টম এক্সএমএল ফাইল ব্যবহার করা উচিত?

যদি তা হয় তবে আমি তার (সি #) কোড উদাহরণ দেখতে চাই।

আমি এই বিষয়ে অন্যান্য আলোচনা দেখেছি, তবে এটি এখনও আমার কাছে পরিষ্কার নয়।


এটি কি। নেট নেটফরমেশন অ্যাপ্লিকেশন? যদি তা হয় তবে আপনি .NET এর কোন সংস্করণটি বিকাশ করছেন?
পোর্টম্যান 13

1
হ্যাঁ, এটি একটি। নেট ফ্রেমওয়ার্ক সংস্করণ 3.5 উইনফোর্স অ্যাপ্লিকেশন।
জ্বালানী

1
আপনার কি পাসওয়ার্ড বা গোপনীয় মানগুলি সংরক্ষণ করতে হবে ? হয়তো কোনও এনক্রিপশন
কিউকিনেট

উত্তর:


593

আপনি যদি ভিজ্যুয়াল স্টুডিওতে কাজ করেন তবে অবিরাম সেটিংস পাওয়া বেশ সহজ। সলিউশন এক্সপ্লোরারে প্রোজেক্টটিতে ডান ক্লিক করুন এবং সম্পত্তি নির্বাচন করুন। সেটিংস ট্যাবটি নির্বাচন করুন এবং সেটিংসের অস্তিত্ব না থাকলে হাইপারলিঙ্কে ক্লিক করুন।

অ্যাপ্লিকেশন সেটিংস তৈরি করতে সেটিংস ট্যাবটি ব্যবহার করুন। ভিজ্যুয়াল স্টুডিও ফাইলগুলি তৈরি করে Settings.settingsএবং Settings.Designer.settingsএতে অ্যাপ্লিকেশনসেটিংজেজSettings থেকে উত্তরাধিকারসূত্রে প্রাপ্ত সিঙ্গলটন শ্রেণি রয়েছে । অ্যাপ্লিকেশন সেটিংস পড়তে / লিখতে আপনি এই কোডটি আপনার কোড থেকে অ্যাক্সেস করতে পারেন:

Properties.Settings.Default["SomeProperty"] = "Some Value";
Properties.Settings.Default.Save(); // Saves settings in application configuration file

এই কৌশলটি কনসোল, উইন্ডোজ ফর্ম এবং অন্যান্য প্রকল্পের প্রকারের জন্যই প্রযোজ্য।

নোট করুন যে আপনার সেটিংসের সুযোগ সম্পত্তি সেট করতে হবে । আপনি যদি অ্যাপ্লিকেশন সুযোগটি নির্বাচন করেন তবে সেটিংস.ডাফল্ট <<আপনার সম্পত্তি> কেবল পঠনযোগ্য।

তথ্যসূত্র: কীভাবে: মাইক্রোসফ্ট ডক্স সহ রান টাইমে ব্যবহারকারী সেটিংস লিখুন


2
আমার যদি কোনও সমাধান থাকে তবে এটি কি পুরো সমাধানের জন্য বা প্রতিটি প্রকল্পের জন্য প্রযোজ্য?
franko_camron

8
@ ফোর: আমি এখানে একটি নেট নেট Win.২ উইন অ্যাপ প্রকল্প পেয়েছি এবং আমার সামারপ্রটিটি কেবল পঠনযোগ্য নয়। Settings.Default.SomeProperty = 'value'; Settings.Default.Save();একটি যাদুমন্ত্র মত কাজ করে. বা এটি কারণ যে আমি ব্যবহারকারীর সেটিংস পেয়েছি?
ডোকম্যান 16'12

4
@ চার: আমি যখন ব্যবহারকারী থেকে অ্যাপ্লিকেশন-স্কোপে একটি সেটিং পরিবর্তন করেছি এবং ফাইলটি সংরক্ষণ করি, তখন আমি উত্পন্ন কোডটিতে সেটারটি অদৃশ্য হয়ে দেখেছি। এটি ক্লায়েন্ট প্রোফাইল 4.0 এর সাথেও ঘটে ...
ডোকম্যান

3
@ চার: দুর্দান্ত লিঙ্ক, যদিও আপনার বক্তব্যটি Settings.Default.Save()ভুল কিছু করে না। @ কাকু উত্তরে বলেছে, অ্যাপ-স্কোপ সেটিংস কেবল পঠনযোগ্য: সংরক্ষণ তাদের পক্ষে অকার্যকর। ব্যবহারকারীর স্কোপ সেটিংস অ্যাপ্লিকেশন কনফিগ সংরক্ষণ করার জন্য সেই কাস্টম পোর্টেবলসেটিংস প্রোভাইডারটি ব্যবহার করুন যেখানে ব্যবহারকারীর অ্যাপডেটা ফোল্ডারে থাকা একের পরিবর্তে এক্সি রয়েছে। না, সাধারণত ভাল নয়, তবে সংকলন থেকে সংকলন করতে একই সেটিংস ব্যবহার করার জন্য আমি বিকাশের সময় এটি ব্যবহার করি (ডাব্লু / ও, তারা প্রতিটি সংকলন সহ নতুন অনন্য ব্যবহারকারী ফোল্ডারগুলি যান)।
মিনিউ

7
এখন পর্যন্ত। নেট ৩.৫ সহ এটি প্রদর্শিত হয় আপনি কেবলমাত্র একটি মান নির্ধারণ করতে এবং শক্তিশালী টাইপকেস্টিং পেতে সেটিংস.ডাফল্ট.সোমপ্রোপার্টি ব্যবহার করতে পারেন। এছাড়াও, অন্যদের সময় বাঁচাতে (এটি বের করার জন্য আমাকে কিছুটা সময় নিয়েছে), আপনাকে প্রপার্টিজ.সেটেটিংস.ডাইফল্ট টাইপ করতে হবে, বা আপনার ফাইলের শীর্ষে আপনারপরেজেক্টনামস্পেস ব্যবহার করুন et একা "সেটিংস" সংজ্ঞায়িত / পাওয়া যায় নি।
eselk

94

আপনি যদি একই এক্সিকিউটিভ হিসাবে একই ডিরেক্টরিতে থাকা কোনও ফাইলকে সংরক্ষণ করার পরিকল্পনা করে থাকেন তবে এখানে একটি দুর্দান্ত সমাধান যা JSON ফর্ম্যাটটি ব্যবহার করে :

using System;
using System.IO;
using System.Web.Script.Serialization;

namespace MiscConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            MySettings settings = MySettings.Load();
            Console.WriteLine("Current value of 'myInteger': " + settings.myInteger);
            Console.WriteLine("Incrementing 'myInteger'...");
            settings.myInteger++;
            Console.WriteLine("Saving settings...");
            settings.Save();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        class MySettings : AppSettings<MySettings>
        {
            public string myString = "Hello World";
            public int myInteger = 1;
        }
    }

    public class AppSettings<T> where T : new()
    {
        private const string DEFAULT_FILENAME = "settings.json";

        public void Save(string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(this));
        }

        public static void Save(T pSettings, string fileName = DEFAULT_FILENAME)
        {
            File.WriteAllText(fileName, (new JavaScriptSerializer()).Serialize(pSettings));
        }

        public static T Load(string fileName = DEFAULT_FILENAME)
        {
            T t = new T();
            if(File.Exists(fileName))
                t = (new JavaScriptSerializer()).Deserialize<T>(File.ReadAllText(fileName));
            return t;
        }
    }
}

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

ওহ, সম্ভবত আরও ভাল বিকল্পটি সেটিংস ফাইলটি ব্যবহারকারীর অ্যাপডাটা ফোল্ডারে সঞ্চয় করা হবে।
ট্রেভর

1
পরিবর্তন করার দরকার নেই DEFAULT_FILENAME, কেবল কল করুন settings.Save(theFileToSaveTo); সমস্ত ক্যাপ হওয়া, DEFAULT_FILENAMEএকটি ধ্রুবক হিসাবে অনুমিত হয় । আপনি যদি পঠন-লিখনের সম্পত্তি চান তবে একটি তৈরি করুন এবং কনস্ট্রাক্টর সেট করুন DEFAULT_FILENAME। তারপরে ডিফল্ট আর্গুমেন্ট মান nullহ'ল এর জন্য পরীক্ষা করুন এবং আপনার সম্পত্তিটিকে ডিফল্ট মান হিসাবে ব্যবহার করুন। এটি একটু বেশি টাইপিং, তবে আপনাকে আরও স্ট্যান্ডার্ড ইন্টারফেস দেয়।
জেসি চিশল্ম

10
আপনার System.Web.Extensions.dllযদি ইতিমধ্যে না থাকে তবে আপনাকে উল্লেখ করতে হবে to
Tek

9
আমি এই উত্তরটির উপর ভিত্তি করে অনেকগুলি উন্নতি করে একটি সম্পূর্ণ গ্রন্থাগার তৈরি করেছি এবং এটি নুজেটে উপলব্ধ করেছি: github.com/Nucs/JsonSettings
NucS

67

রেজিস্ট্রি না-যেতে হয়। আপনি নিশ্চিত নন যে ব্যবহারকারী আপনার অ্যাপ্লিকেশন ব্যবহার করেন, তার রেজিস্ট্রিতে লেখার পর্যাপ্ত অধিকার রয়েছে কিনা।

আপনি app.configঅ্যাপ্লিকেশন-স্তরের সেটিংস সংরক্ষণ করতে ফাইলটি ব্যবহার করতে পারেন (আপনার অ্যাপ্লিকেশন ব্যবহার করা প্রতিটি ব্যবহারকারীর জন্য এটি একই)।

আমি কোনও এক্সএমএল ফাইলে ব্যবহারকারীর নির্দিষ্ট সেটিংস সঞ্চয় করে রাখি যা পৃথক স্টোরেজ বা স্পেশালফোল্ডার . অ্যাপ্লিকেশনডেটা ডিরেক্টরিতে সংরক্ষণ করা হবে।

তার পরে, .NET 2.0 থেকে, app.configফাইলগুলিতে মানগুলি সংরক্ষণ করা সম্ভব ।


8
আপনি যদি প্রতি লগইন / ব্যবহারকারী সেটিংস চান তবে রেজিস্ট্রিটি ব্যবহার করুন।
ততকালীন

19
রেজিস্ট্রি অ-বহনযোগ্য
কেবি।

10
@ তিথনহ্যাকার: বা এনভায়রনমেন্ট.গেটফোল্ডারপাথ (এনভায়রনমেন্ট.স্পেশালফোল্ডার। অ্যাপ্লিকেশনডেটা) ব্যবহার করুন
কেনি মান্

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

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

20

ApplicationSettingsক্লাসে সেটিংস সংরক্ষণ করা সমর্থন করে না app.config ফাইল। ডিজাইনের মাধ্যমে এটি অনেক বেশি; যে অ্যাপ্লিকেশনগুলি সঠিকভাবে সুরক্ষিত ব্যবহারকারীর অ্যাকাউন্টের সাথে চালিত হয় (মনে করুন ভিস্তা ইউএসি) প্রোগ্রামটির ইনস্টলেশন ফোল্ডারে লেখার অ্যাক্সেস পায় না।

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


আপনি দয়া করে আপনার শেষ বাক্যটি প্রসারিত করতে পারেন? অ্যাপকনফাইগ লিখতে বা পৃথক অ্যাপ্লিকেশন লিখতে যা সমস্ত ব্যবহারকারীর ঘরের ফোলারদের মধ্য দিয়ে যেতে হবে, ব্যবহারকারীর জন্য অনুসন্ধান করুন এবং এগুলি সম্পাদনা করবেন?
CannibalSmith

2
পৃথক প্রোগ্রামের উন্নতির জন্য জিজ্ঞাসা করার জন্য একটি ম্যানিফেস্টের প্রয়োজন। গুগল সঠিক সিনট্যাক্স সন্ধান করতে 'অ্যাসিনভোকার অ্যাডমিনিস্ট্রেটর' প্রয়োজন। User.config সম্পাদনা করা ব্যবহারিক নয়, প্রয়োজনীয়ও নয়।
হান্স প্যাস্যান্ট

18

রেজিস্ট্রি / কনফিগারেশনসেটিংস / এক্সএমএল যুক্তিটি এখনও খুব সক্রিয় মনে হচ্ছে। প্রযুক্তিটি যেভাবে এগিয়েছে, আমি সেগুলি ব্যবহার করেছি, তবে আমার প্রিয় থ্রোডের সিস্টেমের ভিত্তিতে বিচ্ছিন্ন স্টোরেজের সাথে মিলিত ।

নিম্নলিখিত নমুনা পৃথক স্টোরেজ কোনও ফাইলের বৈশিষ্ট্যযুক্ত কোনও বস্তুর সঞ্চয় করার অনুমতি দেয়। যেমন:

AppSettings.Save(myobject, "Prop1,Prop2", "myFile.jsn");

সম্পত্তি ব্যবহার করে পুনরুদ্ধার করা যেতে পারে:

AppSettings.Load(myobject, "myFile.jsn");

এটি কেবলমাত্র একটি নমুনা, সেরা অনুশীলনের পরামর্শদাতা নয়।

internal static class AppSettings
{
    internal static void Save(object src, string targ, string fileName)
    {
        Dictionary<string, object> items = new Dictionary<string, object>();
        Type type = src.GetType();

        string[] paramList = targ.Split(new char[] { ',' });
        foreach (string paramName in paramList)
            items.Add(paramName, type.GetProperty(paramName.Trim()).GetValue(src, null));

        try
        {
            // GetUserStoreForApplication doesn't work - can't identify.
            // application unless published by ClickOnce or Silverlight
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.Write((new JavaScriptSerializer()).Serialize(items));
            }

        }
        catch (Exception) { }   // If fails - just don't use preferences
    }

    internal static void Load(object tar, string fileName)
    {
        Dictionary<string, object> items = new Dictionary<string, object>();
        Type type = tar.GetType();

        try
        {
            // GetUserStoreForApplication doesn't work - can't identify
            // application unless published by ClickOnce or Silverlight
            IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForAssembly();
            using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))
            using (StreamReader reader = new StreamReader(stream))
            {
                items = (new JavaScriptSerializer()).Deserialize<Dictionary<string, object>>(reader.ReadToEnd());
            }
        }
        catch (Exception) { return; }   // If fails - just don't use preferences.

        foreach (KeyValuePair<string, object> obj in items)
        {
            try
            {
                tar.GetType().GetProperty(obj.Key).SetValue(tar, obj.Value, null);
            }
            catch (Exception) { }
        }
    }
}

1
বা আরও ভাল এখনও; ডেটা কনট্র্যাক্টজসনসিরাইজার ব্যবহার করুন
বোকজেক

16

আমি এটির জন্য তৈরি একটি লাইব্রেরি ভাগ করতে চেয়েছিলাম। এটি একটি ছোট লাইব্রেরি, তবে। সেটিং ফাইলগুলির চেয়ে একটি বড় উন্নতি (আইএমএইচও)।

গ্রন্থাগারটিকে জট (গিটহাব) বলা হয় । এটি সম্পর্কে আমি লিখেছিলাম একটি পুরানো কোড প্রকল্প নিবন্ধ

উইন্ডোর আকার এবং অবস্থান সম্পর্কে নজর রাখতে আপনি এটি কীভাবে ব্যবহার করবেন তা এখানে রয়েছে:

public MainWindow()
{
    InitializeComponent();

    _stateTracker.Configure(this)
        .IdentifyAs("MyMainWindow")
        .AddProperties(nameof(Height), nameof(Width), nameof(Left), nameof(Top), nameof(WindowState))
        .RegisterPersistTrigger(nameof(Closed))
        .Apply();
}

.Setting ফাইলগুলির সাথে তুলনা করে সুবিধা: এখানে যথেষ্ট কম কোড রয়েছে এবং এটি খুব কম ত্রুটি-ঝুঁকির কারণ আপনার কেবলমাত্র প্রতিটি সম্পত্তি একবার উল্লেখ করা দরকার ।

একটি সেটিংস ফাইলগুলির সাথে আপনাকে প্রতিটি সম্পত্তি পাঁচবার উল্লেখ করতে হবে : একবার আপনি স্পষ্টভাবে সম্পত্তিটি তৈরি করতে এবং কোডে অতিরিক্ত চারবার তৈরি করে যা মানগুলি পিছনে পিছনে নকল করে।

স্টোরেজ, সিরিয়ালাইজেশন ইত্যাদি সম্পূর্ণরূপে কনফিগারযোগ্য। যখন লক্ষ্য বস্তুগুলি একটি দ্বারা তৈরি হয় আইওসি লক্ষ্যযুক্ত ধারক , আপনি [এটিকে হুক আপ করতে পারেন] [] যাতে এটি সমাধান করা সমস্ত অবজেক্টের জন্য স্বয়ংক্রিয়ভাবে ট্র্যাকিংয়ের প্রয়োগ করে, যাতে সম্পত্তি স্থির করার জন্য আপনার যা করতে হবে তা হ'ল একটি [ট্র্যাকযোগ্য] এটিতে বৈশিষ্ট্য।

এটি অত্যন্ত কনফিগারযোগ্য এবং আপনি কনফিগার করতে পারেন: - যখন বিশ্বজুড়ে বা প্রতিটি ট্র্যাক করা অবজেক্টের জন্য ডেটা বজায় থাকে এবং প্রয়োগ করা হয় - এটি কীভাবে সিরিয়ালাইজ করা হয় - যেখানে এটি সঞ্চিত হয় (যেমন ফাইল, ডাটাবেস, অনলাইন, বিচ্ছিন্ন স্টোরেজ, রেজিস্ট্রি) - এমন নিয়ম যা প্রয়োগ / বাতিল করতে পারে একটি সম্পত্তি জন্য স্থায়ী তথ্য

আমাকে বিশ্বাস করুন, গ্রন্থাগারটি শীর্ষস্থানীয়!


14

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

এখানে কোনও ফর্মের অবস্থান এবং আকার সংরক্ষণ করার উদাহরণ রয়েছে।

কনফিগারেশন ডেটাবোজেক্টটি দৃ strongly়ভাবে টাইপড এবং সহজেই ব্যবহারযোগ্য:

[Serializable()]
public class CConfigDO
{
    private System.Drawing.Point m_oStartPos;
    private System.Drawing.Size m_oStartSize;

    public System.Drawing.Point StartPos
    {
        get { return m_oStartPos; }
        set { m_oStartPos = value; }
    }

    public System.Drawing.Size StartSize
    {
        get { return m_oStartSize; }
        set { m_oStartSize = value; }
    }
}

সংরক্ষণ এবং লোড করার জন্য একটি পরিচালক শ্রেণি:

public class CConfigMng
{
    private string m_sConfigFileName = System.IO.Path.GetFileNameWithoutExtension(System.Windows.Forms.Application.ExecutablePath) + ".xml";
    private CConfigDO m_oConfig = new CConfigDO();

    public CConfigDO Config
    {
        get { return m_oConfig; }
        set { m_oConfig = value; }
    }

    // Load configuration file
    public void LoadConfig()
    {
        if (System.IO.File.Exists(m_sConfigFileName))
        {
            System.IO.StreamReader srReader = System.IO.File.OpenText(m_sConfigFileName);
            Type tType = m_oConfig.GetType();
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            object oData = xsSerializer.Deserialize(srReader);
            m_oConfig = (CConfigDO)oData;
            srReader.Close();
        }
    }

    // Save configuration file
    public void SaveConfig()
    {
        System.IO.StreamWriter swWriter = System.IO.File.CreateText(m_sConfigFileName);
        Type tType = m_oConfig.GetType();
        if (tType.IsSerializable)
        {
            System.Xml.Serialization.XmlSerializer xsSerializer = new System.Xml.Serialization.XmlSerializer(tType);
            xsSerializer.Serialize(swWriter, m_oConfig);
            swWriter.Close();
        }
    }
}

এখন আপনি একটি উদাহরণ তৈরি করতে পারেন এবং আপনার ফর্মের লোড এবং ঘনিষ্ঠ ইভেন্টগুলিতে ব্যবহার করতে পারেন:

    private CConfigMng oConfigMng = new CConfigMng();

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load configuration
        oConfigMng.LoadConfig();
        if (oConfigMng.Config.StartPos.X != 0 || oConfigMng.Config.StartPos.Y != 0)
        {
            Location = oConfigMng.Config.StartPos;
            Size = oConfigMng.Config.StartSize;
        }
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Save configuration
        oConfigMng.Config.StartPos = Location;
        oConfigMng.Config.StartSize = Size;
        oConfigMng.SaveConfig();
    }

এবং উত্পাদিত এক্সএমএল ফাইলটি পাঠযোগ্য:

<?xml version="1.0" encoding="utf-8"?>
<CConfigDO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StartPos>
    <X>70</X>
    <Y>278</Y>
  </StartPos>
  <StartSize>
    <Width>253</Width>
    <Height>229</Height>
  </StartSize>
</CConfigDO>

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

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

@ ফিলিপস্ট্র্যাটফোর্ড হতে পারে অ্যাপডাটা ফোল্ডারটি আপনার জন্য একটি বিকল্প, ঘুড়ি দ্বারা উল্লিখিত সি #% অ্যাপডাটা% এর পথ পাচ্ছেন দেখুন ।
ডিয়েটার মীমকেন

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


5

অন্যান্য বিকল্পগুলি, কাস্টম এক্সএমএল ফাইলটি ব্যবহার না করে আমরা আরও বেশি ব্যবহারকারী বন্ধুত্বপূর্ণ ফাইল ফর্ম্যাটটি ব্যবহার করতে পারি: জেএসএন বা ওয়াইএমএল ফাইল।

  • আপনি নেট নেট 4.0.০ ডায়নামিক ব্যবহার করেন, এই লাইব্রেরিটি ব্যবহার করা সত্যিই সহজ (সিরিয়ালাইজ, ডিসরিয়ালাইজেশন, নেস্টেড অবজেক্টস সমর্থন এবং আউটপুট ক্রম হিসাবে আপনার পছন্দ অনুযায়ী + একাধিক সেটিংস একের সাথে একীকরণ করা ) জসনকনফিগ (ব্যবহার অ্যাপ্লিকেশনসেটিংসবেসের সমান)
  • .NET YAML কনফিগারেশন লাইব্রেরির জন্য ... আমি জাসনকনফিগের মতো ব্যবহার করা সহজ এমন কোনও সন্ধান পাইনি

আপনি এখানে পরিবেশিত হিসাবে তালিকাভুক্ত হিসাবে একাধিক বিশেষ ফোল্ডারে (সমস্ত ব্যবহারকারী এবং প্রতিটি ব্যবহারকারীদের জন্য) আপনার সেটিংস ফাইল সংরক্ষণ করতে পারেন ।

আপনি যদি একাধিক সেটিংস ব্যবহার করতে চান, আপনি সেই সেটিংসটি মার্জ করতে পারেন: উদাহরণস্বরূপ, ডিফল্ট + বেসিক ইউজার + অ্যাডমিনিউজারের জন্য সেটিংস মার্জ করা। আপনি আপনার নিজের বিধিগুলি ব্যবহার করতে পারেন: সর্বশেষটি মান ইত্যাদিকে ওভাররাইড করে etc.


4

"এর অর্থ কি কনফিগারেশন সেটিংস সংরক্ষণ করতে আমার একটি কাস্টম এক্সএমএল ফাইল ব্যবহার করা উচিত?" না, অগত্যা নয়। আমরা এই জাতীয় ক্রিয়াকলাপের জন্য শার্পকনফিগ ব্যবহার করি।

উদাহরণস্বরূপ, যদি একটি কনফিগারেশন ফাইল এর মতো হয়

[General]
# a comment
SomeString = Hello World!
SomeInteger = 10 # an inline comment

আমরা এর মতো মানগুলি পুনরুদ্ধার করতে পারি

var config = Configuration.LoadFromFile("sample.cfg");
var section = config["General"];

string someString = section["SomeString"].StringValue;
int someInteger = section["SomeInteger"].IntValue;

এটি .NET 2.0 এবং উচ্চতর সাথে সামঞ্জস্যপূর্ণ। আমরা উড়তে কনফিগারেশন ফাইল তৈরি করতে পারি এবং আমরা এটি পরে সংরক্ষণ করতে পারি।

সূত্র: http://sharpconfig.net/
গিটহাব: https://github.com/cemdervis/SharpConfig


3

আমি যতদূর বলতে পারি, .NET অন্তর্নির্মিত অ্যাপ্লিকেশন সেটিংস সুবিধা ব্যবহার করে অবিচ্ছিন্ন সেটিংস সমর্থন করে:

উইন্ডোজ ফর্মগুলির অ্যাপ্লিকেশন সেটিংস বৈশিষ্ট্যটি ক্লায়েন্ট কম্পিউটারে কাস্টম অ্যাপ্লিকেশন এবং ব্যবহারকারীর পছন্দগুলি তৈরি করা, সঞ্চয় করা এবং বজায় রাখা সহজ করে। উইন্ডোজ ফর্ম অ্যাপ্লিকেশন সেটিংসের সাহায্যে আপনি কেবল অ্যাপ্লিকেশন ডেটা যেমন ডেটাবেস সংযোগের স্ট্রিংগুলিই নয়, ব্যবহারকারী-নির্দিষ্ট ডেটা যেমন ব্যবহারকারীর অ্যাপ্লিকেশন পছন্দগুলিও সংরক্ষণ করতে পারেন। ভিজ্যুয়াল স্টুডিও বা কাস্টম পরিচালিত কোড ব্যবহার করে, আপনি নতুন সেটিংস তৈরি করতে পারেন, সেগুলি থেকে সেগুলি পড়তে এবং ডিস্কে লিখতে পারেন, এগুলি আপনার ফর্মের বৈশিষ্ট্যগুলিতে আবদ্ধ করতে পারেন এবং লোডিং এবং সংরক্ষণের আগে সেটিংসের ডেটা বৈধ করতে পারেন। - http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx


2
সত্য নয় .. উপরে আকুর উত্তর দেখুন। সেটিংস এবং অ্যাপ্লিকেশনসেটিংবেস ব্যবহার করে এটি সম্ভব
গিশু

2

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

আমি দুটি ভাল বিকল্প কল্পনা করতে পারি:

  • দৃ strongly়ভাবে টাইপিত সংস্করণ এবং
  • অবজেক্ট ওরিয়েন্টেড সংস্করণ।

দৃ the়ভাবে টাইপিত সংস্করণটির সুবিধা হ'ল দৃ strongly়ভাবে টাইপ করা সেটিংসের নাম এবং মান। নাম বা ডেটা ধরণের অন্তর্নির্মিত হওয়ার ঝুঁকি নেই। অসুবিধাটি হ'ল আরও সেটিংস কোডিং করতে হয়, রানটাইমে যোগ করা যায় না।

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

আপনি উভয় সম্পূর্ণ কার্যকরী বাস্তবায়নের কোডটি এখানে পেতে পারেন


2

হ্যাঁ, কনফিগারেশনটি সংরক্ষণ করা সম্ভব - তবে এটি আপনি যেভাবে বেছে নেবেন তার উপর এটি নির্ভর করে। আমাকে প্রযুক্তিগত পার্থক্যগুলি বর্ণনা করতে দিন যাতে আপনার কাছে থাকা বিকল্পগুলি বুঝতে পারেন:

প্রথমত, আপনাকে আলাদা করতে হবে, আপনি নিজের ( ভিজ্যুয়াল স্টুডিওতে) ফাইলটিতে অ্যাপ্লিকেশনসেটিংস বা অ্যাপসেটেটিং ব্যবহার করতে চান - এখানে মৌলিক পার্থক্য রয়েছে, এখানে বর্ণিত হচ্ছে*.exe.configApp.config

উভয়ই পরিবর্তনগুলি সংরক্ষণের বিভিন্ন উপায় সরবরাহ করে:

  • AppSettings পড়তে হবে এবং কনফিগ ফাইলে সরাসরি লিখন (মাধ্যমে করার অনুমতি দেয় config.Save(ConfigurationSaveMode.Modified);, যেখানে কনফিগ হিসাবে সংজ্ঞায়িত করা হয় config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);)।

  • ApplicationSettings পড়ার অনুমতি, কিন্তু আপনি যদি পরিবর্তনগুলি (মাধ্যমে লিখতে Properties.Settings.Default.Save();) এটি, একটি ব্যবহারকারী অনুসারে ভিত্তিতে লেখা হবে বিশেষ স্থান (যেমন সঞ্চিত C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0)। হান্স পাসেন্ট যেমন তার উত্তরে উল্লেখ করেছেন , এটি কারণ যে কোনও ব্যবহারকারী সাধারণত প্রোগ্রাম ফাইলগুলিতে অধিকার সীমাবদ্ধ করে থাকে এবং ইউএসি প্রম্পট না চাওয়া ছাড়া এটিতে এটি লিখতে পারে না। অসুবিধা হ'ল যদি আপনি ভবিষ্যতে কনফিগারেশন কীগুলি যুক্ত করেন তবে আপনাকে প্রতিটি ব্যবহারকারীর প্রোফাইলের সাথে সেগুলি সিঙ্ক্রোনাইজ করতে হবে।

দ্রষ্টব্য: প্রশ্নে উল্লিখিত হিসাবে তৃতীয় বিকল্প রয়েছে: আপনি যদি কনফিগারেশন ফাইলটিকে এক্সএমএল ডকুমেন্ট হিসাবে বিবেচনা করেন তবে আপনি System.Xml.Linq.XDocumentশ্রেণিটি ব্যবহার করে এটি লোড, সংশোধন এবং সংরক্ষণ করতে পারবেন । এটি কাস্টম এক্সএমএল ফাইল ব্যবহার করার প্রয়োজন নেই, আপনি বিদ্যমান কনফিগারেশন ফাইলটি পড়তে পারেন; অনুসন্ধানের উপাদানগুলির জন্য, আপনি লিনক কোয়েরিগুলিও ব্যবহার করতে পারেন। আমি এখানে একটি উদাহরণ দিয়েছি , GetApplicationSettingউত্তরে সেখানে ফাংশনটি পরীক্ষা করে দেখুন ।

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


এই দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ।
NoChance

2
@ ননচ্যান্স - আপনাকে স্বাগতম, খুশি যে আমি আপনাকে সাহায্য করতে পারি!
ম্যাট

নিস! অবশেষে এটি সন্ধান করে 😂😂😂
মোমোরো

1
@ মোমোরো - শুনে ভাল লাগল! ;-)
ম্যাট

1
public static class SettingsExtensions
{
    public static bool TryGetValue<T>(this Settings settings, string key, out T value)
    {
        if (settings.Properties[key] != null)
        {
            value = (T) settings[key];
            return true;
        }

        value = default(T);
        return false;
    }

    public static bool ContainsKey(this Settings settings, string key)
    {
        return settings.Properties[key] != null;
    }

    public static void SetValue<T>(this Settings settings, string key, T value)
    {
        if (settings.Properties[key] == null)
        {
            var p = new SettingsProperty(key)
            {
                PropertyType = typeof(T),
                Provider = settings.Providers["LocalFileSettingsProvider"],
                SerializeAs = SettingsSerializeAs.Xml
            };
            p.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
            var v = new SettingsPropertyValue(p);
            settings.Properties.Add(p);
            settings.Reload();
        }
        settings[key] = value;
        settings.Save();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.