0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
1
.NET 4.x

Чтение структур нескольких binary файлов

07.04.2019, 15:45. Показов 2433. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Интересен метод чтения нескольких binary файлов с разной структурой.
Желательно без serialize.
Я пробую сделать через имя файла.
Вот так код выглядит для одного файла.
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
public partial class MainWindow : Window
    {
        public int NameL { get; set; }
        public char[] Name { get; set; }
        public int CapitalL { get; set; }
        public char[] Capital { get; set; }
        public int Area { get; set; }
        public double Population { get; set; }
        public BindingList<CountryModel> data = new BindingList<CountryModel>();
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
 
        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            var dlg = new OpenFileDialog
            {
                Filter = "Binary file (*.dat)|*.dat"
            };
            if (dlg.ShowDialog() == true)
            {
                PathFile.Text = dlg.FileName;
            }
            TestGrid.ItemsSource = data;
            string inputPath = dlg.FileName;
            using (BinaryReader reader = new BinaryReader(File.Open(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                while (reader.PeekChar() > -1)
                {                  
                    NameL = reader.ReadByte();
                    Name = reader.ReadChars(NameL);
                    CapitalL = reader.ReadByte();
                    Capital = reader.ReadChars(CapitalL);
                    Area = reader.ReadInt32();
                    Population = reader.ReadDouble();
                    string na = new string(Name);
                    string ca = new string(Capital);
                    data.Add(new CountryModel(na, ca, Area, Population));
                }
            }
        }
 
        private void MenuItem_Click_2(object sender, RoutedEventArgs e)
        {
            var dlg = new SaveFileDialog
            {
                Filter = "Binary file (*.dat)|*.dat"
            };
 
            if (dlg.ShowDialog() == true)
            {
                Save(dlg.FileName);
            }
        }
 
        private void Save(string outputPath)
        {
            BinaryWriter writer = new BinaryWriter(File.Open(outputPath, FileMode.Create));
            for (int i = 0; i < data.Count; i++)
            {
                writer.Write((byte)data[i].Name.Length);
                writer.Write(data[i].Name.ToCharArray());
                writer.Write((byte)data[i].Capital.Length);
                writer.Write(data[i].Capital.ToCharArray());
                writer.Write(data[i].Area);
                writer.Write(data[i].Population);
            }
            writer.Close();
        }
 
        private void MenuItem_Click_3(object sender, RoutedEventArgs e)
        {
            data.Add(new CountryModel("", "", 0, 0));
        }
    }
Сейчас создал вот такой атрибут.
C#
1
2
3
4
5
6
7
8
9
public class TestTableAttribute : Attribute
    {
        public string Name { get; set; }
 
        public TestTableAttribute(string name)
        {
            Name = name;
        }
    }
И добавил в модель
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[TestTable("testCountry")]
public class CountryModel
    {
        public string Name { get; set; } 
        public string Capital { get; set; }
        public int Area { get; set; }
        public double Population { get; set; }
 
        public string Hidden = ""; 
 
        public CountryModel(string name, string capital, int area, double population)
        {
            this.Name = name;
            this.Capital = capital;
            this.Area = area;
            this.Population = population;
        }
    }
Теперь вот вопрос, после переноса в модель чтения и сохранения.
Как мне заставить это работать в MainWindow.
Точнее сделать чтобы он смотрел на названия файла и по нему брал нужную мне структуру?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2019, 15:45
Ответы с готовыми решениями:

Параллельное чтение и запись нескольких файлов
Нужно написать программу, которая параллельно копирует несколько файлов с помощью операций...

Одновременное чтение и обработка данных из нескольких файлов, не помещающихся в память
Добрый день, форумчане. Прошу помощи в решении задачи. Задача состоит в том, что нужно...

Чтение нескольких файлов
Приветствую, уважаемые. Возникла небольшая проблемка, вот у меня есть некоторое количество файлов...

Чтение из нескольких файлов
Добрый день,помогите с решением,обьясню что я хочу реализовать. Выбираю из выбрантов файл 1,2 или...

15
1142 / 851 / 262
Регистрация: 30.04.2009
Сообщений: 3,580
09.04.2019, 21:56 2
Непонятно зачем атрибут и где перенос чтения записи в модель
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
09.04.2019, 22:17  [ТС] 3
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Непонятно зачем атрибут и где перенос чтения записи в модель
ну в модель я перенес чтение и запись

а вот как сделать по имени файла чтобы он брал модель вообще не понял
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
09.04.2019, 23:14 4
Лучший ответ Сообщение было отмечено Irbos как решение

Решение

Может так?
Вложения
Тип файла: zip WpfApp1.zip (13.8 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 10:26  [ТС] 5
Цитата Сообщение от Someone007 Посмотреть сообщение
Может так?
Такая ошибка при сохранение
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
13.04.2019, 12:35 6
Цитата Сообщение от Irbos Посмотреть сообщение
Такая ошибка при сохранение
Код меняли?
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 17:05  [ТС] 7
Нет, только начал изучать то что вы мне скинули
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
13.04.2019, 18:01 8
Да действительно я сломал код немного. Вот вроде рабочая версия.
Вложения
Тип файла: zip WpfApp1.zip (14.1 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 20:14  [ТС] 9
Цитата Сообщение от Someone007 Посмотреть сообщение
Да действительно я сломал код немного. Вот вроде рабочая версия.
Спасибо, ещё такой вопрос возник.
Как сделать так чтобы он последнее пустую строчку не сохранял)
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
13.04.2019, 20:41 10
Цитата Сообщение от Irbos Посмотреть сообщение
Как сделать так чтобы он последнее пустую строчку не сохранял)
А она сохраняется? По идее не должна, но я не проверял...

Глянул сохраненный файл, там нет данных из последней пустой строки...
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 20:53  [ТС] 11
Цитата Сообщение от Someone007 Посмотреть сообщение
А она сохраняется? По идее не должна, но я не проверял...
Глянул сохраненный файл, там нет данных из последней пустой строки...
Я сохранил с добавленной строчкой, потом пытаюсь открыть и он пишет
Открываю в hex и последняя строчка заполнена нулями.....
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
13.04.2019, 21:11 12
Лучший ответ Сообщение было отмечено Irbos как решение

Решение

Пишет правильно, имя файла должно совпадать со значением атрибута, вы же сами этого хотели.

А то, что последняя строчка нулями заполнена, у меня такого нет. Вы случайно не пытались её редактировать перед сохранением? Возможно в этом причина.
Миниатюры
Чтение структур нескольких binary файлов  
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 21:19  [ТС] 13
Цитата Сообщение от Someone007 Посмотреть сообщение
Пишет правильно, имя файла должно совпадать со значением атрибута, вы же сами этого хотели.
А то, что последняя строчка нулями заполнена, у меня такого нет. Вы случайно не пытались её редактировать перед сохранением? Возможно в этом причина.
Да мой косяк, спасибо большое за помощь
Переработал и не могу адекватно читать код.
Ещё раз спасибо за помощь
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
17.06.2019, 23:46  [ТС] 14
Возникла кое-какая проблема
После того как я решил попробовать этот метод в с другими файлами появилась одна проблема.
Он стал показывать только последнею запись.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Table("eventmanagement")]
    public class EventManager_Table : IBinaryTable, IBinaryTable<EventManager>
    {
        public BindingList<EventManager> Data { get; } = new BindingList<EventManager>();
 
        public void Load(BinaryReader reader)
        {
            while (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                var rec = new EventManager();
                rec.Read(reader);
                Data.Add(rec);
            }
        }
 
        public void Save(BinaryWriter writer)
        {
            foreach (var rec in Data)
                rec.Write(writer);
        }
    }
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
public class EventManager : IBinaryRecord
    {
        public int CountEvent;
        public short EventNo { get; set; }
        public string EventName { get; set; }
        public string Condition { get; set; }
        public string SettedEvent { get; set; }
        public void Read(BinaryReader reader)
        {
            CountEvent = reader.ReadInt32();
            for (int i = 0; i < CountEvent; i++)
            {
                EventNo = reader.ReadInt16();
                var eventNameL = reader.ReadInt64();
                var eventNameC = reader.ReadChars((int)eventNameL);
                EventName = new string(eventNameC);
                var ConditionL = reader.ReadInt64();
                var ConditionC = reader.ReadChars((int)ConditionL);
                Condition = new string(ConditionC);
                var SettedEventL = reader.ReadInt64();
                var SettedEventC = reader.ReadChars((int)SettedEventL);
                SettedEvent = new string(SettedEventC);
                byte unk2 = reader.ReadByte();
            }
            byte[] unkByte = reader.ReadBytes(9486);
        }
 
        public void Write(BinaryWriter writer)
        {
        }
    }
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
17.06.2019, 23:56 15
Потому что вы неправильно реализовали чтение... Тут похоже надо было немного по другому поступить...
И вообще структура какая-то странная, вы точно её правильно поняли? Мне кажется что должно быть что-то типа этого...
Что-то типа этого...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Table("eventmanagement")]
    public class EventManager_Table : IBinaryTable, IBinaryTable<EventManager>
    {
        public BindingList<EventManager> Data { get; } = new BindingList<EventManager>();
 
        public void Load(BinaryReader reader)
        {
            int count = reader.ReadInt32();
            for (int i = 0; i < count; i++)
            {
                var rec = new EventManager();
                rec.Read(reader);
                Data.Add(rec);
            }
            byte[] unkByte = reader.ReadBytes(9486);
        }
 
        public void Save(BinaryWriter writer)
        {
            foreach (var rec in Data)
                rec.Write(writer);
        }
    }
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
public class EventManager : IBinaryRecord
    {
        public int CountEvent;
        public short EventNo { get; set; }
        public string EventName { get; set; }
        public string Condition { get; set; }
        public string SettedEvent { get; set; }
        public void Read(BinaryReader reader)
        {
                EventNo = reader.ReadInt16();
                var eventNameL = reader.ReadInt64();
                var eventNameC = reader.ReadChars((int)eventNameL);
                EventName = new string(eventNameC);
                var ConditionL = reader.ReadInt64();
                var ConditionC = reader.ReadChars((int)ConditionL);
                Condition = new string(ConditionC);
                var SettedEventL = reader.ReadInt64();
                var SettedEventC = reader.ReadChars((int)SettedEventL);
                SettedEvent = new string(SettedEventC);
                byte unk2 = reader.ReadByte();
        }
 
        public void Write(BinaryWriter writer)
        {
        }
    }
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
17.06.2019, 23:58  [ТС] 16
Цитата Сообщение от Someone007 Посмотреть сообщение
Потому что вы неправильно реализовали чтение... Тут похоже надо было немного по другому поступить...
И вообще структура какая-то странная, вы точно её правильно поняли? Мне кажется что должно быть что-то типа этого...
Что-то типа этого...
Спасибо, я думал на счёт такого варианта, но что то меня спугнуло так попробовать.
0
17.06.2019, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2019, 23:58
Помогаю со студенческими работами здесь

Чтение из нескольких файлов
Доброго времени суток. Подскажите как сделать чтобы программа считывала данные из нескольких...

Чтение данных с нескольких файлов
Пишу программу, котороя будет открывать несколько текстовых фалов, брать с них первую строчку,...

Чтение нескольких файлов с данными в массив
В процессе освоения Мatlab, подскажите как прочитать список файлов в один массив ?...

Циклическое чтение данных из нескольких файлов .txt
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста по следующей проблеме, так в интернете...


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

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

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