C# Доступ к файлам Turbo Pascal .DTA из .Net

Моя проблема. У меня есть устаревшая программа на Turbo Pascal, которая все еще работает в MS DOS. Первоисточник утерян, и мне нужно манипулировать информацией, содержащейся в файлах .DTA.

Я бы очень хотел получить доступ к этой информации из .Net, прочитать и обновить. Первая и очевидная проблема заключается в том, что у меня нет исходной структуры данных для файлов .DTA.

Было бы идеально читать данные автоматически упорядочивая их по столбцам, но я настолько отчаян, что сижу и пытаюсь настроить поля вручную.

Моя ГЛАВНАЯ ПРОБЛЕМА заключается в том, что я не знаю, как читать данные и писать из .Net.

Я пробовал:

using (BinaryReader b = new BinaryReader(File.Open(l_path, FileMode.Open), Encoding.UTF8))

и

OleDbConnection myConnection = 
  new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\;
  Extended Properties=\"text;HDR=YES;FMT=FixedLength\"");
  1. Я могу получить данные; к сожалению, только один столбец без разграничения. Итак, никакой структуры.
  2. Наличие специальных символов (#, @ и т.д.). Я также не знаю, какую кодировку следует использовать.

Может ли кто-нибудь помочь мне читать и писать файлы Pascal .DTA из .net?
Спасибо, Морн.


person Morne Rossouw    schedule 12.06.2012    source источник
comment
Насколько я знаю, не существует стандартного формата для сохранения данных в паскале, поэтому файлы .DTA могут содержать что угодно, от текста до двоичных записей паскаля и чего-то дополнительно зашифрованного. Что вы знаете об их формате?   -  person stmax    schedule 12.06.2012


Ответы (2)


Если мне не изменяет память, расширение .DTA использовалось по умолчанию в инструментарии базы данных Turbo Pascal (точное название ускользает от меня). Я полагаю, что вы все еще можете загрузить Turbo Pascal с веб-сайта Delphi (Embarcadero) - если туда включен инструментарий базы данных, то это, вероятно, ваш лучший выбор - в Turbo Pascal напишите конвертер в какой-либо другой формат, например CSV.

person 500 - Internal Server Error    schedule 12.06.2012
comment
Цените ваш вклад. Другая проблема заключается в том, что эта программа до сих пор активно используется (поверьте!), поэтому преобразование файла .DTA в .csv создаст проблемы. Мне нужно легко изменить несколько записей из бэкэнда. Вот где в игру вступает программа .Net. Если бы я мог просто интерпретировать файл данных… - person Morne Rossouw; 13.06.2012
comment
Что ж, если у вас есть доступ к Delphi и инструментарию базы данных Turbo Pascal, написание Delphi DLL, которая может читать и записывать этот устаревший формат, не так уж нереально. Тем не менее, я думаю, что выполнение этого в чужой (по сравнению с Embarc.) среде разработки потребует непомерно большого количества обратного проектирования. Это, вероятно, то, что вы можете передать в субподряд, если у вас нет навыков работы с Delphi. Я бы предложил помощь, если бы моя тарелка не была так полна. - person 500 - Internal Server Error; 13.06.2012

К сожалению, в файле, вероятно, нет разделителей столбцов. Turbo Pascal упрощает запись структуры записи на диск.

Есть три больших ловушки, которые вы собираетесь поразить.

Первое, на что вы точно наткнулись, — файл явно не в кодировке UTF-8. Turbo Pascal предшествует Unicode, любой текст в файле, без сомнения, является ASCII. Я считаю, что единственный способ получить это в С# - это прочитать его как байты и преобразовать.

Во-вторых, Turbo Pascal имеет тип данных, не имеющий эквивалента в C#. Текст в файле, вероятно, хранится либо в виде массива символов (достаточно просто, просто отбросьте пробелы в конце), либо в виде строки, которая начинается с длины. Первый байт говорит, сколько символов в строке, следующие байты — это символы. Любые байты за пределами указанной длины являются мусором и должны быть отброшены.

Наконец, самый распространенный тип с плавающей запятой в Turbo Pascal — нестандартный. Дело в том, что Turbo Pascal относится к эпохе, когда большинство машин не имели математического сопроцессора, а обычный тип значительно быстрее на машинах, не поддерживающих инструкции 8087.

Я согласен с 500 - Internal Server Error, что это было бы намного проще сделать в Delphi или Turbo Pascal.

person Loren Pechtel    schedule 14.06.2012
comment
Спасибо, ребята, я ценю советы. Это действительно кажется моим единственным вариантом. Наверное, пора откопать ту старую книгу о Паскале... - person Morne Rossouw; 14.06.2012