Робота з файлами в visual basic (вихідні коди) - програмні продукти
Visual Basic .NET
Print #fFile, "Some text"
PrintLine (fFile, "Some text")
Записує рядок в файл і додає символ нового рядка.
Print #fFile, "Some text";
Print (fFile, "Some text")
Записує рядок в файл.
Write #fFile, "Some text"
WriteLine (fFile, "Some text")
Записує рядок в файл, додаючи подвійні лапки на початку і кінці рядка і символ нового рядка.
Write #fFile, "Some text";
Write (fFile, "Some text")
Записує рядок в файл, додаючи подвійні лапки на початку і кінці рядка
Upgrade Wizard автоматично замінює команди і вам немає потреби робити це самостійно, але необхідно пам'ятати про всі можливості при "ручний" міграції коду.
Ось два еквівалентних фрагмента коду на VB6 і VB.NET.
Ніяких проблем з текстовими файлами не виникає, оскільки функції VB.NET дозволяють працювати з рядками при записі в файл також як і VB6. "Надзвичайно дивно, що хлопці з Microsoft не має накидали тут" підводних "каменів!", - скажете ви. Так, вони дуже про вас піклуються.
Двійкові файли і файли довільного доступу
Ще більше здивування у вас, напевно, викличе той факт, що і з двійковими файлами ситуація також як і з текстовими. Ага! Ви вже встигли зрадіти, що ж, тут-то кілька "валунів" прітоплена на вашому шляху.
Перш за все "старі нові" функції Get і Put, що використовувалися для запису в двійкові файли (Binary) і файли довільного доступу (Random) тепер називаються FileGet і FilePut і поводяться трохи інакше. Коли ви записуєте рядки змінної довжини або динамічні масиви даних в файли довільного доступу, автоматично додається заголовок, що визначає довжину, з двох байт.
Також, FileGet не визначає тип переданого масиву під час виконання, якщо масив ні инициализирован попередньо.
Відразу ж розглянемо приклади. Для "більшої наочності" я визначив спеціальну структуру. Ось що ми маємо для виконуваного файлу:
Для початку приклад на VB6:
Ви ще пам'ятаєте, про що я писав, обговорюючи поведінку функції FileGet? Зазвичай в VB6 для читання масиву даних функції Get передається саме неініціалізованих масив. як це і зроблено в прикладі вище.
У VB.NET це викличе помилку, в чому ми і переконаємося, передавши проект на поталу Upgrade Wizard. Розглянемо отриманий код:
Щоб виправити цю помилку досить форматувати масив з хоча б одним елементом. Наприклад так:
Тепер ми можемо прочитати дані, але при цьому легко помітити, що замість очікуваних пар значень i = myBinArray (i) ми бачимо i <> 0 (наприклад, 0 = 0, 1 = 1, 2 = 22 і т.п.). Ось це якраз і є наслідок того, що FileGet розраховує прочитати заголовок із зазначенням числа елементів в масиві. Досить вказати, що необхідно зчитувати динамічний масив, встановивши ArrayIsDynamic = True, як всі наші проблеми знімаються.
Відповідно те ж саме треба зробити і в FilePut.
Приблизно така ж проблема виникає при роботі з рядками фіксованої довжини - файли створені з VB6 невірно зчитуються в VB.NET. Наприклад, наступний код запису і читання в VB6 прекрасно працює, але, в VB.NET можуть виникнути складності.
Причина в тому, що VB.NET, записуючи рядок, вважає її рядком змінної довжини і додає заголовок вказує на її розмір. У цьому випадку рішення не складніше, ніж в попередньому. Установка StringIsFixedLength вирішить цю проблему.
Примітки
Схематично вміст файлів різних типів можна представити так (х - будь-який символ, текстовий або двійковий):
Текстовий файл або двійковий файл
Файл довільного доступу
Наскільки мені відомо, переважна частина програмістів не можуть пояснити, чим відрізняється поведінка динамічного масиву, від статичного масиву (з жорстко заданим розміром - числом елементів). Мабуть, зараз як раз той випадок, коли необхідно прояснити цей момент.
Створимо два масиви:
Тепер у нас є один масив з 256 елементами і один формально "порожній масив", для заповнення якого потрібно використовувати ReDim.
Надалі ми можемо завжди перевизначити розмір динамічного масиву на наш розсуд використовуючи ReDim і ReDim Preserve, але ми не можемо перевизначити розмір статичного масиву. Хоча, здавалося б, у цих двох масивів багато спільного.