Чтение файла произвольного доступа в C#

Кто-нибудь знает, можно ли читать файлы с произвольным доступом на С#?

Я пытаюсь воспроизвести следующую функцию (из старого приложения VB6) на С#:

Open File For Random Shared As #100 Len = Len(Record)
    Get #100, DM, Record
Close #100

Public DM As Long
Public Record As DMrecord

Public Type DMrecord
column1 As Long
column2 As Integer
column3 As Integer
column4 As Integer
column5 As String * 4
End Type

ИЗМЕНИТЬ –

Теперь я попытался использовать DLL VisualBasic, как предложено ниже, и получил следующую ошибку в строке FileGetObject:

«Лучший перегруженный метод, соответствующий Microsoft.VisualBasic.FileSystem.FileGetObject(int, ref object, long), имеет недопустимый аргумент»

Код, который я использую, -

        public class Record 
    {
        public int DMtype;
        public long ecn;


        public Record(int DMtype, long ecn) 
        {
            this.DMtype = DMtype;
            this.ecn = ecn;
        }

        public Record()
        {
        }
    }


string fileName = @"C:\RandomAccess.dat";
        string returnString = string.Empty;
        int row = 1;
        int maxRow = 1000;

        Record aFileRecord = new Record();

        FileSystem.FileOpen(1, fileName, OpenMode.Random, OpenAccess.Read, OpenShare.LockRead);

        while (row < maxRow)
        {
            //Get record 2 1st.>>
            FileSystem.FileGetObject(1, aFileRecord, row);
            returnString += aFileRecord.DMtype.ToString() + "$" + aFileRecord.ecn.ToString();
            row++;
        }

        FileSystem.FileClose(1);

Я попытался установить «Запись» как для структуры, так и для класса и получил ту же ошибку.

РЕДАКТИРОВАТЬ 22/08/13. Я так и не докопался до сути этого, в итоге я экспортировал данные произвольного доступа в текстовые файлы с разделителями-запятыми в VB6, а затем использовал файлы в SSIS.


person user1948635    schedule 30.04.2013    source источник
comment
Вам придется интерпретировать данные самостоятельно, используя BinaryReader. См. здесь, чтобы начать работу Долго вы можете read с BinaryReader.ReadInt64(), Integer с BinaryReader.ReadInt32() и строки, которые вам придется читать по одной за раз. Прочитайте их, как описано в ссылке, которую я дал.   -  person Matthew Watson    schedule 30.04.2013
comment
примечание: vb6 Long на самом деле был int32   -  person John Sobolewski    schedule 30.04.2013
comment
Упс, так что я должен был сказать Длинный вы можете читать с BinaryReader.ReadInt32()   -  person Matthew Watson    schedule 30.04.2013
comment
Попробуйте stackoverflow.com/q/265639/17776   -  person jac    schedule 01.05.2013
comment
Только предположение, object aFileRecord = new Record() и FileSystem.FileGetObject(1, ref aFileRecord, row)   -  person jac    schedule 01.05.2013


Ответы (1)


Просто добавьте ссылку на Microsoft.VisualBasic.dll и используйте FileSystem.FileOpen. указав Random режим открытия и метод FileSystem.FileGetObject . Это ведет себя так же, как оператор Open и ключевое слово Get в VB6.

person MarkJ    schedule 01.05.2013
comment
Спасибо за совет, сейчас посмотрю VisualBasic.dll. - person user1948635; 01.05.2013
comment
Хм, не могу заставить это работать. Строка FileSystem.FileGetObject(1, aFileRecord, 1) выдает ошибку, когда я пытаюсь передать новый экземпляр структуры (aFileRecord в строке выше). Любая идея, что я делаю неправильно? - person user1948635; 01.05.2013
comment
Просто добавлю, что ошибка: лучший перегруженный метод, соответствующий Microsoft.VisualBasic.FileSystem.FileGetObject(int, ref object, long), имеет некоторые недопустимые аргументы. - person user1948635; 01.05.2013
comment
Возможно, ему не нравятся структуры. Вместо этого вы могли бы попробовать использовать класс ?? (Отказ от ответственности — я рекомендую эти методы на основе документации и сам их не использовал.) - person MarkJ; 01.05.2013
comment
Я пробовал как класс, так и структуру, и оба получили одну и ту же ошибку, см. вопрос о редактировании, содержащем обновленный код. - person user1948635; 01.05.2013
comment
@user1948635 user1948635 Вы забыли поставить ref aFileRecord. Метод ожидает там ссылку на объект, а не на сам объект. - person ThunderGr; 05.10.2013