Работает ли метод Print() в VB.NET с файлами, открытыми с двоичным доступом?

Я пытаюсь записать данные в двоичный файл, используя метод Print(), но когда я запускаю его, я получаю исключение System.IO Bad File Mode. Кто-нибудь знает, что здесь происходит не так? Вот код объявления FileOpen, который может иметь какое-то отношение к этому? Спасибо

FileOpen(filenumber, "path to file", OpenMode.Binary, OpenAccess.Write, OpenShare.LockReadWrite)  
Print(filenumber, expression(variable))

person Nate Koppenhaver    schedule 06.03.2011    source источник
comment
Вы спрашиваете о методе Print, но показали совершенно другую строку кода. О каком Print методе вы говорите? Как ты это называешь? Где этот код? Это гарантированно будет иметь отношение к этому вопросу.   -  person Cody Gray    schedule 06.03.2011
comment
Я предоставил строку кода, которая открывает файл, потому что я подумал, что это может иметь какое-то отношение к тому, почему я не могу вызвать Print()   -  person Nate Koppenhaver    schedule 06.03.2011


Ответы (1)


Почему вы используете Print в первую очередь? Эта функция включена для обратной совместимости с приложениями VB 6. Если вы пишете новое приложение на VB.NET, вам следует использовать другую функцию.

Самый простой способ быстро оторваться от земли — использовать объект My.Computer.FileSystem для чтения и записи в файлы. Это даже обеспечивает лучшую производительность, чем устаревшие функции, такие как FileOpen и Print. Дополнительные пояснения и пример кода доступны здесь, в MSDN. Конкретно:

person Cody Gray    schedule 06.03.2011
comment
Причина, по которой я использую Print(), заключается в том, что Write() разделяет данные запятыми, и мне нужна функция файлового интерфейса, чтобы просто выводить данные, которые я ей передаю (я использую это для передачи ассемблерного кода в файл . EXE) - person Nate Koppenhaver; 06.03.2011
comment
@Nate: Не предлагалось использовать Write вместо Print. Обе эти устаревшие функции включены в VB.NET только для обратной совместимости с кодом VB 6. Новые приложения должны использовать стандартные функции файлового ввода-вывода .NET. Они удобно представлены программистам VB с помощью объекта My.Computer.FileSystem. Прочтите ссылки в моем ответе. И возьмите хорошую книгу по VB.NET: это совершенно другой язык, чем VB 6, и если вы пытаетесь использовать их таким же образом, вы наносите себе и своему приложению огромный ущерб. медвежья услуга. - person Cody Gray; 06.03.2011
comment
Кроме того, я не знаю, почему Print не работает. Я никогда не использовал его в VB.NET, поэтому не могу вам сказать. Я я пытаюсь сказать вам, что это пустая трата времени, чтобы пытаться понять, почему это не работает. Использование правильных функций в первую очередь не только лучшая идея, но и они будут работать намного лучше. - person Cody Gray; 06.03.2011
comment
вы узнаете что-то новое каждый день. Я ничего не знаю о программировании на VB6, VB.NET был моим первым языком. (Хотя я немного знаю QBasic) - person Nate Koppenhaver; 06.03.2011
comment
@Nate: Тогда откуда вы берете советы по использованию таких функций, как Print? На данный момент язык существует достаточно долго, поэтому никто не должен обучать устаревшим функциям. Как я уже говорил, если вы учитесь по книге или онлайн-руководству, сделайте себе одолжение и найдите обновление, написанное специально для VB.NET. Язык несет в себе большой багаж по причинам обратной совместимости. Отличная вещь, если она вам нужна, но не очень хорошая для новых проектов. Вот почему многие профессиональные программисты охотятся за VB.NET. Это отличный язык, если вы используете его правильно. - person Cody Gray; 06.03.2011
comment
Книги, которые я читал по VB.NET, не слишком касались файлового ввода-вывода. Я просто нашел этот метод, копаясь в Intellisense. - person Nate Koppenhaver; 06.03.2011
comment
Итак, я думаю, мне не нужно использовать FileOpen(), чтобы открыть файл для использования My.Computer.FileSystem.WriteAllBytes()? - person Nate Koppenhaver; 06.03.2011
comment
@Nate: Верно, документы скажем, этот метод открывает файл, записывает в него, а затем закрывает. Это чрезвычайно удобно, если вы делаете все записи одновременно, но если вы добавляете данные в файл в цикле, вам следует вместо этого использовать BinaryWriter, чтобы избежать накладных расходов на повторное открытие и закрытие. Обязательно ознакомьтесь с образцами, на которые я ссылаюсь. Если вы пытаетесь научиться программировать с помощью IntelliSense (и я не ругаюсь, я сделал это сам), вы должны быть знакомы с документацией MSDN. - person Cody Gray; 06.03.2011
comment
Только что понял: WriteAllBytes не будет работать, нет никакого преобразования из Char в Byte (Char - это тип данных, с которым я работаю). Будет ли что-нибудь работать с этим типом данных? - person Nate Koppenhaver; 06.03.2011
comment
@Nate: Конечно, есть. Метод Convert.ToByte имеет перегруженную версию, которая принимает значение типа Char как Аргумент. Но помните, символы не обязательно являются байтами в .NET. Для преобразования между текстовыми символами и двоичными байтами вам необходимо использовать кодировку. Для этого см. класс System.Text.Encoding. Джон Скит опубликовал отличную статью, объясняющую Unicode в .NET Framework, которая довольно актуально здесь. - person Cody Gray; 06.03.2011
comment
Я использую функции Chr() и Asc() для битового сдвига файла. Операции файлового ввода-вывода находятся в цикле, поэтому я думаю, что WriteAllBytes добавит программе слишком много накладных расходов. - person Nate Koppenhaver; 06.03.2011