Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/32: Рейтинг темы: голосов - 32, средняя оценка - 4.88
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
1

Как записать/прочитать многострочный текст в XML файл?

20.08.2018, 19:57. Показов 5912. Ответов 33
Метки нет (Все метки)

Предполагаю сохранять настройки приложения в XML файл.
Для этого использую следующий код.
Props.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
//надо добавить для работы класса
using System.Xml.Serialization;
using System.IO;
 
 
namespace SettingWinForm
{
    //Класс определяющий какие настройки есть в программе
    public class PropsFields
    {
        public String XMLFileName = Environment.CurrentDirectory + "\\settings.xml";
        //Чтобы добавить настройку в программу просто добавьте туда строку вида -
        //public ТИП ИМЯ_ПЕРЕМЕННОЙ = значение_переменной_по_умолчанию;
        public String TextValue = @"File Settings";
        public DateTime DateValue = new DateTime(2011, 1, 1);
        public Decimal DecimalValue = 555;
        public Boolean BoolValue = true;
    }
    //Класс работы с настройками
    public class Props
    {
        public PropsFields Fields;
 
        public Props()
        {
            Fields = new PropsFields();
        }
        //Запись настроек в файл
        public void WriteXml()
        {
            XmlSerializer ser = new XmlSerializer(typeof(PropsFields));
 
            TextWriter writer = new StreamWriter(Fields.XMLFileName);
            ser.Serialize(writer, Fields);
            writer.Close();
        }
        
        //Чтение настроек из файла
        public void ReadXml()
        {
            if (File.Exists(Fields.XMLFileName))
            {
                XmlSerializer ser = new XmlSerializer(typeof(PropsFields));
                TextReader reader = new StreamReader(Fields.XMLFileName);
                Fields = ser.Deserialize(reader) as PropsFields;
 
                reader.Close();
            }
            else
            {
                //можно написать вывод сообщения если файла не существует
            }
        }
    }
}


Form1.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Windows.Forms;
 
namespace SettingWinForm
{
    public partial class Form1 : Form
    {
        #region Settings action
        Props props = new Props(); //экземпляр класса с настройками 
        //Запись настроек
        private void writeSetting()
        {
            //Запись значения в ComboBox1
            props.Fields.TextValue = textBox1.Text;
 
            //Запись значения в ComboBox1
            props.Fields.TextValue = comboBox1.Text;
            
            //Запись значения в checkBox1
            props.Fields.BoolValue = checkBox1.Checked;
 
            props.WriteXml();
        }
        //Чтение настроек
        private void readSetting()
        {
            props.ReadXml();
 
            textBox1.Text = props.Fields.TextValue;
            comboBox1.Text = props.Fields.TextValue;
            checkBox1.Checked = props.Fields.BoolValue;
        }
        #endregion
 
        #region Form Action
        public Form1()
        {
            InitializeComponent();
        }
 
       
        #endregion
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            writeSetting(); 
        }
 
        private void button2_Click_1(object sender, EventArgs e)
        {
            readSetting();
        }
 
        // Очистить 
        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            comboBox1.Text = "";
            checkBox1.Checked = false;
 
 
        }
    }
}







Как Записать/прочитать многострочный текст из "textBox1" в XML файл?
Миниатюры
Как записать/прочитать многострочный текст в XML файл?  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2018, 19:57
Ответы с готовыми решениями:

Как можно в .dat файл записать и прочитать массив
как можно в .dat файл записать и вытащить массив. массив: st="строка 1"; st="строка 2";...

Как прочитать (записать) свойства процессов (из диспетчера задач) в файл (память)?
Можно ли записать свойства процессов из диспетчера задач в отдельный файл (формат любой) или...

Как прочитать xml файл из внешнего источника и на основе полученных данных сформировать HTML таблицы?
Дана задача, нужно по API получить листы с сервера, найти среди них с подтверждением(DoubleOptIn) и...

Прочитать/Пропарсить значения из Xml файла и записать в переменную
Если в кратце, то мне нужно получить все значения и контейнера Message, а как сделать это в C# хз...

33
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
20.08.2018, 20:11 2
https://www.cyberforum.ru/post8042329.html
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 21:23  [ТС] 3
Цитата Сообщение от Rius Посмотреть сообщение
https://www.cyberforum.ru/post8042329.html
Блин...
сложно..
Я как в "тумане"... образно понимаю, что там (в приведённом вами примере) делается...

А на основе моего кода можно это(записать/прочитать многострочный текст) сделать?

или лучше ваш пример разобрать и применить?
0
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
20.08.2018, 21:29 4
Сначала применить.
Потом разобрать в отладчике, как всё работает.
Потом сможете своё написать.
0
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 21:36  [ТС] 5
Rius,
Если вам не сложно, не могли бы вы уточнить где размещать "namespace MyApp.Core.Classes", "namespace MyApp.DB.Classes"?
отдельными классами?

И
C#
1
string filename = Saved<Options>.Instance.FileName;
C#
1
2
Saved<Options>.Instance.FileName = filename;
Saved<Options>.Save();
на кнопки "вешать"?
0
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
20.08.2018, 21:52 6
В отдельных файлах, это обычные классы. Пространства имён можете на свои заменить.

Можно и на кнопки.
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.08.2018, 22:11 7
Soft17, В том коде, что вы показали вам нужно добавить поля в класс PropsFileds. А потом вызвать метод Writexml
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 22:38  [ТС] 8
Цитата Сообщение от Rius Посмотреть сообщение
В отдельных файлах, это обычные классы. Пространства имён можете на свои заменить.
Можно и на кнопки.
Сделал на сколько хватило опыта.
Буду признателен если скорректируете.

SavedLoad.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
 
namespace INISettWinForm
{
    public static class Saved<T>
    {
        private static T mInstance;
        private static object mLocker = new object();
 
        private static string SettinsDirectory
        {
            get
            {
                // With VS Host Process enabled will return other directory
                string appdata = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
                string directory = Path.Combine(appdata, Application.CompanyName);
                directory = Path.Combine(directory, Application.ProductName);
                return directory;
            }
        }
 
        private static string Filename
        {
            get
            {
                string typename = typeof(T).FullName;
                string filename = Path.Combine(SettinsDirectory, typename + ".xml");
                return filename;
            }
        }
 
        public static T Instance
        {
            get
            {
                lock (mLocker)
                {
                    if (mInstance == null)
                    {
                        mInstance = Load();
                    }
 
                    return mInstance;
                }
            }
        }
 
        private static T Load()
        {
            T obj = default(T);
 
            try
            {
                if (File.Exists(Filename))
                {
                    using (FileStream fs = new FileStream(Filename, FileMode.Open))
                    {
                        using (XmlReader xr = new XmlTextReader(fs))
                        {
                            XmlSerializer ser = new XmlSerializer(typeof(T));
 
                            if (ser.CanDeserialize(xr))
                            {
                                obj = (T)ser.Deserialize(xr);
                            }
                        }
                    }
                }
            }
            catch (InvalidOperationException)
            {
            }
            catch (XmlException)
            {
            }
 
            if (obj == null)
                obj = (T)Activator.CreateInstance(typeof(T));
            return obj;
        }
 
        public static void Save()
        {
            if (mInstance != null)
            {
                if (!Directory.Exists(SettinsDirectory))
                {
                    Directory.CreateDirectory(SettinsDirectory);
                }
 
                try
                {
                    XmlSerializer ser = new XmlSerializer(typeof(T));
 
                    // Temp buffer
                    using (MemoryStream ms = new MemoryStream())
                    {
                        // Try serialize
                        using (TextWriter wr = new StreamWriter(ms))
                        {
                            ser.Serialize(wr, mInstance);
                            wr.Flush();
 
                            // If serialized successfully, try write to file
                            using (FileStream fs = new FileStream(Filename, FileMode.Create))
                            {
                                ms.WriteTo(fs);
                                fs.Flush();
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    System.Diagnostics.Debug.WriteLine(exc.Message);
                }
            }
        }
    }
}


Settingss.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace INISettWinForm
{
    internal class Options
    {
        public string FileName { get; set; }
 
        public Options()
        {
            this.FileName = this.DefaultDatabaseFilename;
        }
 
        private string DefaultDatabaseFilename
        {
            get
            {
                string codeBase = Assembly.GetExecutingAssembly().CodeBase;
                UriBuilder uri = new UriBuilder(codeBase);
                string path = Uri.UnescapeDataString(uri.Path);
                path = Path.GetDirectoryName(path);
                return Path.Combine(path, "database.sqlite");
            }
        }
    }
}


Form1.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace INISettWinForm
{
    public partial class Form1 : Form
    {
        string textB1;
        string cmboB1;
        // boolean checkB1;
        Boolean checkB1;
 
 
 
        public Form1()
        {
            InitializeComponent();
        }
        
        // сохранить
        private void button1_Click(object sender, EventArgs e)
        {
 
            textB1 = textBox1.Text;
            cmboB1 = comboBox1.Text;
 
            Saved<Options>.Instance.FileName = textB1;
            Saved<Options>.Instance.FileName = cmboB1;
            // Saved<Options>.Instance.FileName = checkB1;
 
 
            Saved<Options>.Save();
        }
 
        // Прочитать
        private void button2_Click(object sender, EventArgs e)
        {
            textB1 = Saved<Options>.Instance.FileName;
            cmboB1 = Saved<Options>.Instance.FileName;
            // textB1 = Saved<Options>.Instance.FileName;
        }
 
        // Очистить
        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            comboBox1.Text = "";
            checkBox1.Checked = false;
        }
    }
}
Миниатюры
Как записать/прочитать многострочный текст в XML файл?  
0
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 22:43  [ТС] 9
Цитата Сообщение от PoPsa85 Посмотреть сообщение
В том коде, что вы показали вам нужно добавить поля в класс PropsFileds. А потом вызвать метод Writexml
Я уже вроде так пробовал...
Не могли бы вы продемонстрировать своё предложение.
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.08.2018, 22:53 10
Soft17,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class PropsFields
    {
        public String XMLFileName = Environment.CurrentDirectory + "\\settings.xml";
        public String TextValue = @"File Settings";
        public DateTime DateValue = new DateTime(2011, 1, 1);
        public Decimal DecimalValue = 555;
        public Boolean BoolValue = true;
        public string TextboxText { get; set; }
    }
 
PropsFields Fields = new PropsFields(); // Создали объект класса
Fields.TextboxText = textBox1.Text; //Добавили текст
XmlSerializer ser = new XmlSerializer(typeof(PropsFields));
TextWriter writer = new StreamWriter(Fields.XMLFileName);
ser.Serialize(writer, Fields);
 writer.Close();
Лишнее из класса можно убрать вроде DateTime

Добавлено через 3 минуты
P.S. вообще вместо строки TextboxText лучше использовать массив. что бы данные записывались вот так:
XML
1
2
3
4
5
<TextboxText>
    <string>one</string>
    <string>two</string>
    <string>three</string>
  </TextboxText>
а не одной строкой.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 23:06  [ТС] 11
Цитата Сообщение от PoPsa85 Посмотреть сообщение
вообще вместо строки TextboxText лучше использовать массив. что бы данные записывались вот так:
Это у меня тоже на очереди было...
А как правильно отобразить это кодом?
Не могли бы вы подсказать.

Предложенный вами вариант возвращает сохранённые настройки строкой, а мне нужно столбиком:
"Строка_1
Строка_2
Строка_3

"
Миниатюры
Как записать/прочитать многострочный текст в XML файл?  
0
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 23:11  [ТС] 12
Сохраняет в XML так
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<PropsFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <XMLFileName>Z:\vs\csharp\prb\71\01_pr\SettingWinForm\bin\Debug\settings.xml</XMLFileName>
  <TextValue>Экз_1</TextValue>
  <DateValue>2011-01-01T00:00:00</DateValue>
  <DecimalValue>555</DecimalValue>
  <BoolValue>true</BoolValue>
  <TextboxText>Строка_1
Строка_2
Строка_3</TextboxText>
</PropsFields>
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
20.08.2018, 23:34 13
Soft17, Ну правильно. Покажите как вы эти строки добавляете. В текстбокс имеется в виду.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
20.08.2018, 23:40  [ТС] 14
Цитата Сообщение от PoPsa85 Посмотреть сообщение
Ну правильно. Покажите как вы эти строки добавляете. В текстбокс имеется в виду.
Это вопрос?
Вручную. Перенос выполняется нажатием "Ввод".
Сохраняется в настройки оно столбиком, а как всё таки забрать из настроек столбиком, а не строчкой?

Цитата Сообщение от PoPsa85 Посмотреть сообщение
P.S. вообще вместо строки TextboxText лучше использовать массив. что бы данные записывались вот так:
или как это реализовать с использованием массива?
Миниатюры
Как записать/прочитать многострочный текст в XML файл?  
0
802 / 551 / 237
Регистрация: 01.07.2018
Сообщений: 1,810
21.08.2018, 00:05 15
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Soft17, в классе поле поменять на массив
C#
1
public string[] TextboxText { get; set; }
И разбить строку в массив по символу окончания строки
C#
1
Fields.TextboxText = textBox1.Text.Split('\n');
Вот так.
1
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
21.08.2018, 08:24 16
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
INISettWinForm
INI файлов здесь нет, есть XML.

Свойство всего одно:
Цитата Сообщение от Soft17 Посмотреть сообщение
C#
1
public string FileName { get; set; }
А в него записываете разные значения:
Цитата Сообщение от Soft17 Посмотреть сообщение
C#
1
2
Saved<Options>.Instance.FileName = textB1;
Saved<Options>.Instance.FileName = cmboB1;
Зачем? Всё равно сохранится только последнее.
Если нужно сохранять разные строки, создайте соответствующие свойства под них в классе Options:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace INISettWinForm
{
    public class Options
    {
        public string String1 { get; set; }
        public string String2 { get; set; }
        public string String3 { get; set; }
 
        public Options()
        {
            this.String1 = String.Empty;
            this.String2 = String.Empty;
            this.String3 = String.Empty;
        }
    }
}
Класс, кстати, не internal, а public.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
21.08.2018, 09:08  [ТС] 17
Цитата Сообщение от Rius Посмотреть сообщение
Класс, кстати, не internal, а public.
Спасибо.
Исправил.
Выдавало ошибку. "public static void Save()"
exc {"XMLSettWinForm.Options недоступен в силу его уровня защиты. Возможна обработка только общих типов."} System.Exception {System.InvalidOperationException}

Сейчас всё работает нормально.
Сохраняет textBox1 и comboBox1.

Сделал так.
Form1.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace XMLSettWinForm
{
    public partial class Form1 : Form
    {
        string textB1;
        string cmboB1;
        // bool checkB1;
 
        public Form1()
        {
            InitializeComponent();
        }
 
 
        // сохранить
        private void button1_Click(object sender, EventArgs e)
        {
            textB1 = textBox1.Text;
            cmboB1 = comboBox1.Text;
            // checkB1 = checkBox1.Checked; 
 
 
            Saved<Options>.Instance.String1 = textB1;
            Saved<Options>.Instance.String2 = cmboB1;
            // Saved<Options>.Instance.String3 = checkB1;
 
 
            Saved<Options>.Save();
        }
 
        // Прочитать
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = Saved<Options>.Instance.String1;
            comboBox1.Text = Saved<Options>.Instance.String2;
        }
        
        // Очистить
        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            comboBox1.Text = "";
            checkBox1.Checked = false;
        }
    }
}


Получаю файл настроек
XML
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<Options xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <String1>Строка_1
Строка_2
Строка_3</String1>
  <String2>Р*РєР·_1</String2>
</Options>
Вопросы.
1. Как изменить место и имя файла настроек?
Сейчас сохраняет сюда: "c:\Users\admin\AppData\Local\XMLSettWinForm\XMLSettWinForm\ XMLSettWinForm.Options.xml"

2. Как изменить кодировку файла настроек?
А то сохраняется шифровкой

3. Как сделать чтобы сохранялось "checkBox1"?
Я пробовал, но что-то не срабатывает.
Надо отдельный "DefaultDatabaseFilename" под "bool" делать?


4. Как сделать чтобы сохранялось поле "Дата" в формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС"?
Я пока не вывел на WinForm, но потом сделаю
0
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
21.08.2018, 10:49 18
  1. А куда должен сохранять?
    Там есть свойства private static string Filename и private static string SettinsDirectory.
  2. Исходники должны быть в юникоде, а не CP1251.
  3. Одно сохраняемое значение - одно свойство.
  4. Самое простое - создать дополнительное свойство для преобразования в строку и обратно.
    Ещё можно унаследовать XmlTextWriter/XmlTextReader и его подкрутить.
    Или реализовать IXmlSerializable в классе Options.
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Serialization;
 
namespace ConsoleAppSettings
{
    public static class Saved<T>
    {
        private static T mInstance;
        private static object mLocker = new object();
 
        private static string SettinsDirectory
        {
            get
            {
                // With VS Host Process enabled will return other directory
                string appdata = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
 
                var versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location);
 
                string directory = Path.Combine(appdata, versionInfo.CompanyName);
                directory = Path.Combine(directory, versionInfo.ProductName);
                return directory;
            }
        }
 
        private static string Filename
        {
            get
            {
                string typename = typeof(T).FullName;
                string filename = Path.Combine(SettinsDirectory, typename + ".xml");
                return filename;
            }
        }
 
        public static T Instance
        {
            get
            {
                lock (mLocker)
                {
                    if (mInstance == null)
                    {
                        mInstance = Load();
                    }
 
                    return mInstance;
                }
            }
        }
 
        private static T Load()
        {
            T obj = default(T);
 
            try
            {
                if (File.Exists(Filename))
                {
                    using (FileStream fs = new FileStream(Filename, FileMode.Open))
                    {
                        using (XmlReader xr = new XmlTextReader(fs))
                        {
                            XmlSerializer ser = new XmlSerializer(typeof(T));
 
                            if (ser.CanDeserialize(xr))
                            {
                                obj = (T)ser.Deserialize(xr);
                            }
                        }
                    }
                }
            }
            catch (InvalidOperationException)
            {
            }
            catch (XmlException)
            {
            }
 
            if (obj == null)
                obj = (T)Activator.CreateInstance(typeof(T));
            return obj;
        }
 
        public static void Save()
        {
            if (mInstance != null)
            {
                if (!Directory.Exists(SettinsDirectory))
                {
                    Directory.CreateDirectory(SettinsDirectory);
                }
 
                try
                {
                    XmlSerializer ser = new XmlSerializer(typeof(T));
 
                    // Temp buffer
                    using (MemoryStream ms = new MemoryStream())
                    {
                        // Try serialize
                        using (TextWriter wr = new StreamWriter(ms))
                        {
                            ser.Serialize(wr, mInstance);
                            wr.Flush();
 
                            // If serialized successfully, try write to file
                            using (FileStream fs = new FileStream(Filename, FileMode.Create))
                            {
                                ms.WriteTo(fs);
                                fs.Flush();
                            }
                        }
                    }
                }
                catch (Exception exc)
                {
                    Debug.WriteLine(exc.Message);
                }
            }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System;
using System.Globalization;
using System.Xml.Serialization;
 
namespace ConsoleAppSettings
{
    public class Options
    {
        public string String1 { get; set; }
        public string String2 { get; set; }
        public string String3 { get; set; }
 
        [XmlIgnore]
        public DateTime DateTime1 { get; set; }
 
        [XmlElement(ElementName = "DateTime1")]
        public string _ProxyDateTime1
        {
            get { return this.DateTime1.ToString("yyyyMMdd", CultureInfo.InvariantCulture); }
            set { this.DateTime1 = DateTime.ParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture); }
        }
 
        public Options()
        {
            this.String1 = String.Empty;
            this.String2 = String.Empty;
            this.String3 = String.Empty;
            this.DateTime1 = DateTime.Now;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
 
namespace ConsoleAppSettings
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = Saved<Options>.Instance.String1;
            var b = Saved<Options>.Instance.DateTime1;
 
            Saved<Options>.Instance.String1 = "Привет";
            Saved<Options>.Instance.DateTime1 = DateTime.Now;
            Saved<Options>.Save();
        }
    }
}
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
21.08.2018, 12:29  [ТС] 19
Немного скорректировал под себя предложенный вами код.
Теперь сохраняет в файл "settings.xml", который находится в одном каталога с "XMLSettWinForm.exe".

settings.xml
XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<Options xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <String1>Строка_1
Строка_2
Строка_3</String1>
  <String2>Экз_1</String2>
  <bool1 />
  <DateTime1>21.08.2018 11:54:16</DateTime1>
</Options>

Цитата Сообщение от Rius Посмотреть сообщение
2. Исходники должны быть в юникоде, а не CP1251.
Не могли бы вы уточнить. что имеете ввиду под исходниками.
Я вроде ничего не менял, а файл "settings.xml" сохраняется уже в нормальной кодировке

Цитата Сообщение от Rius Посмотреть сообщение
3. Одно сохраняемое значение - одно свойство.
Прошу прощения, но что-то у меня не получается сохранить "checkBox1", не могли бы вы подсказать как решить этот вопрос.
0
Эксперт .NET
7785 / 5249 / 1251
Регистрация: 25.05.2015
Сообщений: 16,016
Записей в блоге: 14
21.08.2018, 12:36 20
Цитата Сообщение от Soft17 Посмотреть сообщение
Не могли бы вы уточнить. что имеете ввиду под исходниками.
Я вроде ничего не менял, а файл "settings.xml" сохраняется уже в нормальной кодировке
Исходники программы. Текст файла с кодом, в котором прописана строка русского текста.

Цитата Сообщение от Soft17 Посмотреть сообщение
Прошу прощения, но что-то у меня не получается сохранить "checkBox1", не могли бы вы подсказать как решить этот вопрос.
Свойство в Options должно быть типа bool. И сохранять туда нужно не checkBox, а checkBox.Checked.

Цитата Сообщение от Soft17 Посмотреть сообщение
файл "settings.xml", который находится в одном каталога с "XMLSettWinForm.exe".
Каким образом определили, что в одном каталоге?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2018, 12:36

Как создать xml файл и записать в него данные из richtextbox?
Добрый день, вечер или ночь. Вот такой у меня вопросик: Я программно создаю структуру xml файла и...

Как вывести многострочный текст в одну строку?
Привет! Нужно многострочный текст перевести в одну строку. Как это сделать?

Прочитать xml файл, желательно через XmlDocument
&lt;response retval='0' sval='Success' lastAccess='1/10/2012 11:33:57 AM' expires='1/10/2012 11:53:57...

Прочитать файл и записать в другой файл
В файле хранятся через &quot;,&quot; след числа от 1 до 45 прочитать файл и записать в другой файл в котором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru