示例#1
0
        /// <summary>
        /// Чтение заголовочного файла
        /// </summary>
        /// <param name="tableHeaderFileFdt">Адрес файла заголовка таблиц</param>
        /// <returns>Структура таблицы данных</returns>
        public static TableStructure Read(string tableHeaderFileFdt)
        {
            #region Чтение файла заголовка таблицы .fdt

            using (FileStream tableHeaderFileFdtFileStream = new FileStream(tableHeaderFileFdt, FileMode.Open))
            {
                var buffHeaderFilesTypesSize = new byte[Marshal.SizeOf(typeof(ModelStructs.Header_files_types))];          // Создаем буфер необходимого размера
                tableHeaderFileFdtFileStream.Read(buffHeaderFilesTypesSize, 0, buffHeaderFilesTypesSize.Length);           // Читаем необходимый объем из файла
                var headerFilesTypes = ReadBytes.BuffToStruct <ModelStructs.Header_files_types>(buffHeaderFilesTypesSize); // Преобразуем byte[] в структуру

                // тестовый вывод проверки правильности кодировки символов в файле
#if DEBUG
                Console.WriteLine(headerFilesTypes.name_f_bin);
                Console.WriteLine(headerFilesTypes.name_f_pnt);
#endif
                var buffFieldTypeSize = new byte[Marshal.SizeOf(typeof(ModelStructs.Field_type))];
                ModelStructs.Field_type[] fieldTypes = new ModelStructs.Field_type[headerFilesTypes.count_field_all];
                for (int i = 0; i < headerFilesTypes.count_field_all; i++)
                {
                    tableHeaderFileFdtFileStream.Read(buffFieldTypeSize, 0, buffFieldTypeSize.Length);
                    fieldTypes[i] = ReadBytes.BuffToStruct <ModelStructs.Field_type>(buffFieldTypeSize);
                }

                // длина байт дополнительных атрибутов полей
                short moreInfoSize = ReadBytes.TwoBytesToShort(tableHeaderFileFdtFileStream);

                var buffExtendetFieldTipeSize = new byte[Marshal.SizeOf(typeof(ModelStructs.Extendet_field_tipe))];
                ModelStructs.Extendet_field_tipe[] еxtendetFieldTipes = new ModelStructs.Extendet_field_tipe[headerFilesTypes.count_field_all];
                for (int i = 0; i < headerFilesTypes.count_field_all; i++)
                {
                    tableHeaderFileFdtFileStream.Read(buffExtendetFieldTipeSize, 0, buffExtendetFieldTipeSize.Length);
                    еxtendetFieldTipes[i] = ReadBytes.BuffToStruct <ModelStructs.Extendet_field_tipe>(buffExtendetFieldTipeSize);
                }

                short    fieldNameLenght;
                string[] fieldNames = new string[headerFilesTypes.count_field_all];
                for (int i = 0; i < headerFilesTypes.count_field_all; i++)
                {
                    fieldNameLenght = ReadBytes.TwoBytesToShort(tableHeaderFileFdtFileStream);
                    fieldNames[i]   = ReadBytes.StreamOfBytesToString(tableHeaderFileFdtFileStream, fieldNameLenght);
                }
                // вносим полученные данные из файла в модель данных
                var tableStructure = new TableStructure(headerFilesTypes, fieldTypes, еxtendetFieldTipes, fieldNames);

                return(tableStructure);
            }

            #endregion
        }
示例#2
0
        // todo нужно решить с переменными внутри метода, сейчас они тестово

        /// <summary>
        /// Чтение полей по маске
        /// </summary>
        /// <param name="fileStream"></param>
        /// <param name="bitsMask"></param>
        /// <param name="tableStructure"></param>
        internal static string[] ReadSelecToMasktDataFileSream(FileStream fileStream, long bitsMask, TableStructure tableStructure, int tableRecordLength)
        {
            // строка полей для возвращаемого значения
            var fieldEtkaDataReady = new string[tableStructure.TableFieldAttributes.Length];
            var remainingBytes     = tableRecordLength;
            //short field = 0;
            var s         = Convert.ToString(bitsMask, 2);
            var maskArray = s.Select(x => byte.Parse(x.ToString())).ToArray();

            // перебираем биты маски, чтоб определить что нам читать в файле
            //foreach (FieldNumberEnum fieldNumber in Enum.GetValues(typeof(FieldNumberEnum)))
            for (int field = 0; field < maskArray.Length; field++)
            {
                if (tableStructure.TableFieldAttributes.Length < field)
                {
                    break;
                }
                // если поле в маске включено
                if (maskArray[field] == 1)
                {
                    // определяем тип поля, читаем его
                    // число
                    if (tableStructure.TableFieldAttributes[field].DataType == 0x14 ||
                        tableStructure.TableFieldAttributes[field].DataType == 0x16 ||
                        tableStructure.TableFieldAttributes[field].DataType == 0x18)
                    {
                        var a = tableStructure.TableFieldAttributes[field].TableColumnCode;
                        var b = tableStructure.TableFieldAttributes[field].DataLength;
                        var d = tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable;
                        if (tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x0B ||
                            tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x05)
                        {
                            throw new ArgumentException("Субтаблица здесь");
                        }
                        var e = tableStructure.AdditionalTableFieldAttributes[field].ColumnNumber;

                        var f = 0;
                        if (b == 2)
                        {
                            f = ReadBytes.TwoBytesToShort(fileStream);
                        }
                        fieldEtkaDataReady[field] = f.ToString();
                        remainingBytes           -= b;

                        continue;
                    }
                    // строка
                    if (tableStructure.TableFieldAttributes[field].DataType == 0x22 ||
                        tableStructure.TableFieldAttributes[field].DataType == 0x2C ||
                        tableStructure.TableFieldAttributes[field].DataType == 0x12)
                    {
                        var a = tableStructure.TableFieldAttributes[field].TableColumnCode;
                        var b = tableStructure.TableFieldAttributes[field].DataLength;
                        var d = tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable;
                        if (tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x0B ||
                            tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x05)
                        {
                            throw new ArgumentException("Субтаблица здесь");
                        }
                        var e = tableStructure.AdditionalTableFieldAttributes[field].ColumnNumber;
                        // длина данных в таблице важнее, чем длина данных в описании таблицы.
                        if (b > remainingBytes)
                        {
                            b = (ushort)remainingBytes;
                        }
                        var f = ReadBytes.StreamOfBytesToString(fileStream, b);

                        fieldEtkaDataReady[field] = f;
                        remainingBytes           -= b;

                        continue;
                    }
                    // За данным полем перечисляются поля, которые используются, как субтаблица
                    if (tableStructure.TableFieldAttributes[field].DataType == 0x0A ||
                        tableStructure.TableFieldAttributes[field].DataType == 0x1A)
                    {
                        continue;
                    }
                    // Содержит множество чисел, разделенных квадратными скобками
                    if (tableStructure.TableFieldAttributes[field].DataType == 0x26)
                    {
                        var a = tableStructure.TableFieldAttributes[field].TableColumnCode;
                        var b = tableStructure.TableFieldAttributes[field].DataLength;
                        var d = tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable;
                        if (tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x0B ||
                            tableStructure.AdditionalTableFieldAttributes[field].BelongingToSubtable == 0x05)
                        {
                            throw new ArgumentException("Субтаблица здесь");
                        }
                        var e = tableStructure.AdditionalTableFieldAttributes[field].ColumnNumber;
                        // длина данных в таблице важнее, чем длина данных в описании таблицы.
                        if (b > remainingBytes)
                        {
                            b = (ushort)remainingBytes;
                        }
                        var f = ReadBytes.StreamOfBytesToString(fileStream, b);

                        fieldEtkaDataReady[field] = f;
                        remainingBytes           -= b;

                        continue;
                    }
                    else
                    {
                        throw new ArgumentException("Неизвестный тип данных в поле");
                    }
                }
            }
            // Читаем биты, которые остались как строку, возможно понадобится
            string aa;

            if (remainingBytes > 0)
            {
                aa = ReadBytes.StreamOfBytesToString(fileStream, remainingBytes);
            }

            return(fieldEtkaDataReady);
        }