Visual basic как найти файл

Главная » Функции VBA »

28 Апрель 2011              99715 просмотров

  • CurDir() – функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:
        Dim sCurDir As String
        sCurDir = CurDir("D")
  • Dir() — позволяет искать файл или каталог по указанному пути на диске. Пример использования можно посмотреть в статье: Просмотреть все файлы в папке
  • EOF() — при операции записи в файл на диске эта функция вернет True, если вы находитесь в конце файла. Обычно используется при работе с текстовыми файлами — .txt. При сохранении книг Excel лучше использовать стандартные методы: Save и SaveAs.
  • Error() – позволяет вернуть описание ошибки по ее номеру. Генерировать ошибку нужно при помощи метода RaiseError() специального объекта Er.
  • Print – записывает в открытый файл указанный текст. Далее будет приведен пример использования данной функции
  • FreeFile() — позволяет определить номер следующего свободного файла, который можно использовать как номер файла при его открытии методом Open. Предпочтительно применять именно этот метод определения номера файла(вместо статичного #1), чтобы не было неоднозначности обращения к файлам. Ниже приведены примеры применения данной функции при обращении к файлам
  • FileAttr() — позволяет определить, как именно был открыт файл в файловой системе: на чтение, запись, добавление, в двоичном или текстовом режиме и т.п. Применяется для работы с текстовыми файлами, открытыми при помощи Open "C:Text1.txt" For [] As #1
    Открыть файл можно несколькими способами, приведу примеры наиболее распространенных вариантов:

    • Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
          Dim MyChar
          Open "C:Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input)
          Do While Not EOF(1)  'пока файл не кончился
              ' Получаем по одному символу и добавляем его к предыдущим
              MyChar = MyChar & Input(1, #1)
          Loop
          Close #1 ' Закрываем файл
          'Выводим его содержание в окно Immediate
          '(отобразить Immediate: Ctrl+G в окне редактора VBA)
          Debug.Print MyChar
          'или в MsgBox
          MsgBox MyChar, vbInformation, "www.excel-vba.ru"
    • Ouput() — метод открывает файл для записи. Например, чтобы записать в файл строку, содержащую все ячейки в выделенном диапазоне, можно использовать такой код:
      Sub SelectionToTxt()
          Dim s As String, rc As Range
          Dim ff
          'запоминаем все значения из выделенной строки в строку
          For Each rc In Selection
              If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки
                  s = rc.Value
              Else 'если уже записано - добавляем через TAB
                  s = s & vbTab & rc.Value
              End If
          Next
          ff = FreeFile
          'Открываем текстовый файл
          'если файла нет - он будет создан
          Open "C:Text1.txt" For Output As #ff
          'записываем значение строки в файл
          Print #ff, s
          Close #ff ' Закрываем файл
      End Sub

      Важно помнить, что при открытии файла таким методом(Output) все предыдущие данные из файла стираются и в файле будет записано только то, что мы записали в текущем сеансе. Если данные необходимо добавить к имеющимся – используется метод Append

    • Append() — метод открывает файл для записи, но в отличии от Output записывает данные в конец файла, а не перезаписывает текущие данные. Например, код добавления выделенных ячеек как одной строки в имеющийся файл будет выглядеть так:
      Sub SelectionToTxt_Add()
          Dim s As String, rc As Range
          Dim ff
          'запоминаем все значения из выделенной строки в строку
          For Each rc In Selection
              If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки
                  s = rc.Value
              Else 'если уже записано - добавляем через TAB
                  s = s & vbTab & rc.Value
              End If
          Next
          ff = FreeFile
          'Открываем текстовый файл
          'если файла нет - он будет создан
          Open "C:Text1.txt" For Append As #ff
          'записываем значение строки в файл
          Print #ff, s
          Close #ff ' Закрываем файл
      End Sub
  • FileDateTime() — позволяет получить информацию о последнем времени обращения к указанному файлу. Если к файлу после создания ни разу не обращались, то это будет время создания файла. Если попытаться обратиться к уже открытой книге/файлу – то будет получено время открытия книги/файла, а не создания или сохранения.
        sFileDateTime = FileDateTime("C:Text1.txt")
  • FileLen() — позволяет определить длину указанного файла в байтах:
        MsgBox FileLen("C:Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"
  • GetAttr() — возможность обратиться к файлу к файловой системе и получить информацию об его атрибутах (скрытый, доступен только для чтения, архивный и т.п.)
  • InputB() — позволяет указывать количество байт, которые надо считать из файла. Альтернатива методу Open в случаях, когда необходимо считывать данные не по конкретным строкам, а именно побайтово.
  • Loc() — от Location, то есть местонахождение — возвращает число, которое определяет текущее место вставки или чтения в открытом файле.
  • Seek() — очень похожа на функцию Loc(), но Seek() возвращает информацию о позиции, с которой будет выполняться следующая операция чтения или вставки.
  • LOF() — length of file — позволяет определить длину открытого файла в байтах.

Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Содержание

Введение
Работа с дисками и папками, путь
CurDir — текущая папка
ChDrive — смена логического диска
ChDir — смена папки
Dir — список файлов/папок
Name — переименование
MkDir — создание папки
RmDir — удаление папки
Kill — удаление файла
SetAttr — установка атрибутов


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Низкоуровневые функции
Идентификатор файла
Open #
Close #
Reset
Чтение и запись (общая сводка и принципы)
Write #
Print #
Spc
Tab #
Width #
Input #
Line Input #
Get #
Put #
Seek #
Примеры
Команды, операторы и функции в алфавитном порядке (низкоуровневые операторы помечены знаком #):
ChDrive,
ChDir,
Close #,
CurDir,
Dir,
FreeFile #,
Get #,
Input #,
Kill,
Line Input #,
MkDir,
Name,
Open #,
Print #,
Put #,
Reset #,
RmDir,
SetAttr,
Seek #,
Spc #,
Tab #,
Width #,
Write #

Одной из важнейших составляющих любого языка программирования является способность считывать и записывать информацию из файлов.
Стандартно это называется функциями низкого уровня (Low Level) и в полном объеме представлено в VBA.
Кстати, именно эта особенность и является основой опасности макросов.

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


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


P.S.! Завершение переработки материалов разработчика приводит к совершенно неутешительным выводам.
Материала по этой теме всегда было очень мало, да и качество оставляло желать лучшего.
Теперь же он стал «обструганным» под непонятный стандарт, разорванным в несвязанное словоизвержение и напичканным примерами,
половина из которых только запутывает ситуацию, а вторая — ничего не иллюстрирует.
Ну, или почти так.

Работа с файлами, дисками и папками, путь

Логика изложения основана на том, что можно сделать с существующими объектами, а уже потом — как создать новый.
Поскольку многие команды распространяются не только на работу с каталогами, но и на файлы, полное изложение приводится именно здесь.

Все, перечисленное здесь, не имеет прямого отношения к низкоуровневым функциям, но без этой информации работать нельзя в принципе.

Первым является вопрос о том, где мы сейчас находимся.
Совсем неочевиден не только ответ, но и то, что сам вопрос будет своевременно задан.
Данный тезис становится все более актуальным с каждым годом и мне не хотелось бы, чтобы мои ученики бились об него лбом.

CurDir

Определение текущей папки.

Синтаксис

CurDir [(диск)]

Из синтаксиса можно понять (или нет) достаточно многое.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Перечисленное не дает однозначного ответа на возникающие вопросы, но является основой для таковых.
Частичные решения есть в разделе Примеры.

ChDrive

Инструкция для смены текущего диска (ChDrive) работает довольно примитивно. Так, вариант

ChDrive “D”

определит текущим диском диск «D:». Из примера видно, что приводится только литерал, без двоеточия.

ChDir

Изменяет текущий каталог или текущую папку

Синтаксис

Chdir <путь>

Внимание! Изменяется текущая папка на указываемом диске, а не сам диск.
Для смены диска потребуется команда ChDrive.

В значении пути можно использовать обозначения относительного перемещения.
Например,


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Dir

Функция возвращает строку (String) с именем обнаруженных на диске файла, папки или подпапки.
Если объект файловой системы обнаружен не будет, возвратится пустая строка.

Синтаксис

Dir [(<путь>, [<атрибуты>])]

В имени можно использовать знаки подстановки маски файла (* и ?).

Передача в качестве аргумента пустой строки возвращает список всех файлов и папок.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Атрибуты (копия из справки)

Константа Значение Описание
vbNormal 0 Файлы без атрибутов (Значение по умолчанию.)
vbReadOnly 1 В дополнение к файлам без атрибутов определяет файлы, доступные только для чтения
vbHidden 2 В дополнение к файлам без атрибутов определяет скрытые файлы
vbSystem 4 В дополнение к файлам без атрибутов определяет системные файлы
vbVolume 8 Определяет метку тома, то есть имя логического диска (не букву!). Если указан какой-либо другой атрибут, параметр vbVolume игнорируется
vbDirectory 16 В дополнение к файлам без атрибутов определяет каталоги (папки)

Из контекста описания понятно, что атрибуты могут суммироваться.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Name

Оператор Name переименовывает файл или папку и/или перемещает их в новое место.

Синтаксис

Name <oldpathname> As <newpathname>

При этом

  • Обрабатываются только уже существующие объекты.
  • Файл может быть перемещен на другой диск.
  • Файлы, открытые низкоуровневыми процедурами, надо предварительно закрыть.
  • Перемещение папок и подпапок возможно только в пределах логического диска.

MkDir

Создает новый каталог или папку.

Синтаксис

Mkdir <путь>

Если диск не указан, новые каталог или папка создаются на текущем диске.
Имя присваивается с учетом регистра символов.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


RmDir

Удаляет существующую директорию или папку.

Синтаксис

RmDir <путь>

Невозможно удалить папку, содержащую файлы, так что следует вначале удалить их, используя команду Kill.
Также этой командой нельзя удалить файл.

Kill

Удаляет файлы с диска.

Синтаксис

Kill <путь>

В качестве пути указывается строка, содержащая имя одного или нескольких файлов, предполагаемых к удалению.
Строка может содержать любой фрагмент пути, начиная от логического диска, то есть относительный или абсолютный.

В имени можно использовать знаки подстановки маски файла (* и ?).

Так как команда удаляет только файлы, для удаления папок следует воспользоваться командой RmDir.

SetAttr

Устанавливает атрибуты файла.

Синтаксис

SetAttr <имя файла>, <атрибуты>

Оба параметра являются обязательными. Имя файла может содержать путь.

Нельзя изменять атрибуты у открытых файлов!

Атрибуты:

Константа Значение Описание
vbNormal 0 Без атрибутов (по умолчанию)
vbReadOnly 1 Только для чтения (Read-only)
vbHidden 2 Скрытый файл (Hidden)
vbSystem 4 Системный файл (System)
vbArchive 32 Файл изменен после последнего резервного копирования

Атрибуты при указании могут суммироваться.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Низкоуровневые функции

Рассуждая здраво, практически невозможно сформировать однозначную последовательность изложения, так как тогда мы упремся в проблему яйца и курицы.
Даже понимание того, что прежде чем считывать файл, он должен быть создан не очень помогает: чтение выполняется намного чаще.

Идентификатор файла

Основным моментом для работы с обсуждаемым функционалом является то, что каждому файлу, над которым производятся действия, обязан быть присвоен целочисленный идентификатор (FileNumber) типа Byte.
Таким образом, может быть открыто до 511 файлов (1–511). По умолчанию используется лишь 255.
Все обращения к файлам (чтение и запись) производятся только(!) через идентификатор, предваряемый знаком диеза, например, #1.

Его должен задать программист, но делать это вручную допустимо только для простых ситуаций. Лучше воспользоваться следующей функцией

FreeFile [(RangeNumber)]

где RangeNumber — 0 (1–255) или 2 (256–511).

Простейший вариант обращения (запроса) к функции выглядит так:

MyFileNum = FreeFile

Далее по тексту будет использоваться именно выделенная красным переменная, содержащая получаемый ID (для упрощения записи).
Если не будет заявлено другое или использовано явное указание.

И еще раз, для более четкого понимания. В небольших проектах и программах будет более чем оправдано непосредственное указание идентификатора в командах: #1, #2…

Команда Open #

Открывает файл для операций ввода/вывода (input/output, I/O).

Синтаксис

Open <имя файла> For <mode> [Access <вид доступа>] [<lock>] As [#]FileNumber [Len = <RecLength>]

Здесь имя файла определяет имя, которое может содержать путь;
mode указывает режим открытия файла: Append (добавление), Binary (двоичный), Input (чтение), Output (запись) либо Random (случайный) (см. ниже);
Access определяет вид доступа: Read (чтение), Write (запись), Read Write (чтение и запись);
lock ключевое слово, определяющее доступность файла для других процессов: Shared, Lock Read, Lock Write или Lock Read Write;
[#]FileNumber заменяется на числовой идентификатор файла, используемый для последующей работы функций.
Len определяет размер записи (≤32767 (байт)), необходимый для внесения информации в файл с помощью Put #.

Если указываемый на запись файл отсутствует, то он будет создан.
Естественно, попытка чтения несуществующего файла закончится ошибкой (см. Dir).

Описание команды упрощено!

Команда Close #

После завершения работы файл должен быть закрыт. Иначе какой-либо доступ к нему может быть заблокирован (в примитивном понимании и без дополнительного обсуждения).
Для этого используется следующая команда:

Close [FileNumberList]

В качестве параметра передается номер файла, номера файлов через запятую или ничего. В последнем случае закроются все открытые файлы.

Примеры

	Close ' Закрыть все открытые файлы
	Close #1 ' Закрыть файл с идентификатором #1
	Close #1, #7 ' Закрыть два файла (с идентификаторами #1 и #7)
	Close #ProjID ' Закрыть файл с идентификатором, сохраненным в переменной памяти ProjID

См. также Reset.

Reset

Закрывает все файлы, открытые с помощью оператора Open, записывая содержимое их буферов на диск.

По существу, дублирует команду Close без атрибутов.

Чтение и запись

Как уже сказано выше, команда Open # позволяет открыть файл для использования в разных режимах, которые можно разделить на три группы.

  • Последовательный (Sequential) доступ (режимы Input, Output и Append) используется для записи в текстовые файлы, например, журналы ошибок и отчеты.
  • Прямой или произвольный доступ (Random) используется для считывания и записи данных в файле без его закрытия.
    Файлы с прямым доступом сохраняются данные в записях, что ускоряет нахождение требуемой информации.
  • Двоичный доступ (режим Binary) используется для считывания или записи любого байта в файле, например, при сохранении или отображении растрового рисунка.

Сводка стандартных операторов, используемых для чтения и записи в разных режимах.

Тип доступа Запись данных Чтение данных
Последовательный (Sequential) Print #, Write # Input #
Произвольный (Random) Put Get
Двоичный (Binary) Put Get

Write #

Записывает данные в последовательный файл в структурированном виде.

Синтаксис

Write #FileNumber, [OutputList]

Необязательный параметр OutputList представляет одно или несколько числовых, или строковых выражений через запятую, которые нужно записать в файл.
В переводе на обыденный язык, каждая строка подобного результирующего файла является перечнем значений с разделителем, каждое из которых записано по строгим правилам.
Фактически мы получаем известный большинству CSV-файл.
Чтобы не возникало неожиданностей при считывании, следует очень четко придерживаться правил.

Отсутствие OutputList (запятая в команде остается!) приводит к записи пустой строки.

Некоторые важные правила и особенности:

  • В качестве разделителя в outputlist можно использовать пробел, точку с запятой или запятую.
    По очень многим соображениям настоятельно рекомендую использовать только точку с запятой.
  • Числовые данные всегда записываются с помощью точки в качестве разделителя целой и дробной части.
  • Вся информация записывается в особом виде, зависящем от типа данных и знание об этом создает довольно серьезную путаницу.
    Важно четко разделить информацию и понимать, что OutputList записывается в формате VBA.
    Никакие последующие «причуды форматирования» нас не касаются.
    Знать их нужно, чтобы находить и исправлять ошибки, либо для вывода информации, условно говоря, вручную.
    То есть без помощи, которую нам предоставляет функция Write #.
  • Из предыдущего тезиса неизбежно вытекает, что некоторые данные проще выводить, предварительно записав их значение в переменную.
    Например, дату или код ошибки.
    Естественным образом это складывается для информации, получаемой посредством вычислений.
  • Сохранение (запись) данных:
      Строка — заключается в кавычки
      Число — цифры без кавычек
      Логические — #FALSE# и #TRUE#
      Null — #FALSE# и #TRUE#
      Дата — в универсальном формате даты
      Ошибка — #ERROR ErrorCode#, где ErrorCode является соответствующим номером
  • Нельзя использовать строки, уже содержащие в себе кавычки.
  • В конец файла (после записи последнего символа) будет вставлен символ новой строки (Chr(13) + Chr(10)).

Примеры (все данные записываются в ранее открытый файл с идентификатором #1)

   Write #1, 'Запись пустой строки
   Write #1, False; True 'Запись истинного и ложного значений
   Write #1, Tr(1); Tr(2); Tr(3) 'Запись значений трех последовательных элементов массива
   Write #1, Now; 128; True; "Текст"; MyVar 'Запись разнородных значений

Данные, записанные с помощью Write #, обычно считываются из файла с помощью оператора Input #.
Именно во взаимодействии этой пары и заключен весь смысл.

В подобном файле крайне удобно хранить настройки для работы проекта, которые пользователь может изменить в соответствии со своими потребностями.
Для передачи подобных макросов на сторону следует предусматривать (встраивать) возможности восстановления файлов, если пользователь их удалит или отредактирует вручную.

С другой стороны, набор множества таких строк представляет собой своего рода таблицу базы данных.

Print #

Записывает отформатированные данные в последовательный файл.

Синтаксис

Print #FileNumber, [OutputList]

OutputList — выражение или список выражений, которые необходимо вывести.

Его синтаксис

[{Spc(n) | Tab [(n)]}] [выражение] [позиция]

См. Spc #, Tab #, а также Width #.
Выражение может быть числовым или строковым, «позиция» определяет столбец, где будет начало вывода.

С учетом специфического применения оператора, детали его действия опущены.

Spc

Функция используется с оператором Print # или методом Print для позиционирования выходных данных. Аналог Space().

Синтаксис

Spc(n)

Параметр n указывает, сколько пробелов будет возвращено. При переполнении строки, излишек переходит на следующую.

Если не умничать, то функция будет работать только с моноширинным шрифтом.

Пример

	Print #1, "Последующий текст начнется через 10 пробелов"; Spc(10); "вот он!"

Tab #

Используется с оператором Print # или методом Print для позиционирования выходных данных.

Синтаксис

Tab[(n)]

Вставляет табулятор. Если параметр не указан, печать смещается к следующей позиции (шаг равен 14 символам).
Наличие параметра перемещает к позиции с указанным номером. А если она уже была, то на эту позицию, но следующей строки.

Ширина (длина строки) определяется значением Width #.

Width #

Оператор Width # назначает ширину строки вывода для файла, открытого с помощью оператора Open #.

Синтаксис

Width #FileNumber, width

Если значение width равно 0, длина строки является неограниченной. Оно используется по умолчанию.

Input #

Читает строку со структурированными данными из открытого последовательного файла и сохраняет эти данные в переменных.

Синтаксис

Input #FileNumber, VarList

Обычно данная инструкция считывает файлы, созданные посредством Write #.
Использовать ее следует только с файлами, открытыми в режиме Input или Binary.

Параметр VarList представляет собой перечисленный список переменных, в которые сохраняются считываемые данные.

Примеры

	Input #2, Var1, Var2, Var3

Line Input #

Считывает одну строку из открытого последовательного файла и присваивает ее переменной типа String или Variant.

Синтаксис

Line Input #FileNumber, VarName

Оператор следует отнести к самому востребованному варианту считывания данных из файла.
Считанная строка может быть подвергнута любой обработке.

Get #

Считывает данные из открытого файла на диске в переменную.

Синтаксис

Get [#]FileNumber, [RecNumber], VarName

Необязательный параметр RecNumber типа Variant (Long) указывает на номер записи (для файлов, открытых в режиме Random)
или байтовое число (для файлов, открытых в режиме Binary), с которого начинается считывание. При его отсутствии, запятая сохраняется
Результат сохраняется в переменную VarName.

Длинное и глупое описание работы функции можно свести к следующему.

  1. Читаем описание Put #.
  2. Если вы не знаете длину записи (Len), то не сможете правильно открыть файл и, как следствие, правильно прочитать его.
    Единственным адекватным выходом будет анализ исходного файла «глазами».

Данные, для считывания с помощью Get, обычно записываются в файл с помощью Put #.

Примеры

	Get #4,,BufferVar

Put #

Записывает данные из переменной в файл на диске.

Синтаксис

Put [#]FileNumber, [RecNumber], VarName

Необязательный параметр RecNumber типа Variant (Long) указывает на номер записи (для файлов, открытых в режиме Random)
или байтовое число (для файлов, открытых в режиме Binary), с которого начинается запись.
Если его не использовать, то производится запись следующего номера, после последнего, определенного обращением к любому из операторов
Get #, Put или Seek #.

Особенности для файлов, открытых в режиме Random:

  1. Параметр Len, задаваемый при открытии файла, играет ключевую роль.
    Во-первых, длина записи не может его превышать.
    Во-вторых, если запись меньше, то она дополняется пробелами до размера Len.
  2. Если записываемая переменная является строкой переменной длины, оператор Put записывает 2-байтовый дескриптор c длиной строки, а затем переменную.
    То есть длина записи, указанная предложением Len в операторе Open, должна быть по крайней мере на 2 больше, чем фактическая длина строки записываемых данных.
  3. Если записываемая переменная имеет числовой подтип Variant, оператор Put записывает дополнительно 2 байта, указывающие на тип. См. п.2.
  4. Если записываемая переменная имеет строковый подтип Variant, оператор Put записывает дополнительно 2 байта, указывающие на тип и еще 2 — на длину.
    Соответственно, значение Len должно быть увеличено на 4.
  5. Если записываемая переменная является динамическим массивом пользовательского типа, Put записывает дескриптор, длина которого равна 2 плюс в 8 раз больше числа измерений,
    то есть 2 + 8 * число измерений. То есть, для одномерного массива — 10 (2+8*1), для двумерного — 18 (2+8*2) и т.д.
    Плюс размер массива, описать который нормально сотрудники Microsoft не удосужились.
  6. Если записываемая переменная является массивом фиксированного размера, оператор Put записывает только данные, без дескриптора.
  7. При любом другом типе переменной все также, как и в п.6.

Особенности для файлов, открытых в режиме Binary (в дополнение к особенностям Random):

  • Параметр Len, задаваемый при открытии, не действует. Значения переменных записываются последовательно, без заполнителя.
  • Для любого другого массива, чем массив типа, определяемого пользователем, оператор Put записывает только данные, без дескриптора.
  • Оператор Put записывает строки переменной длины, не являющиеся элементами типов, определяемых пользователем, с числом байтов равных числу знаков в строке.

Данные, записанные с помощью Put, обычно считываются из файла с помощью Get #.

Seek #

Задает положение следующей операции чтения/записи в файле, открытом с помощью оператора Open #.

Синтаксис

Seek [#]FileNumber, position

Параметр position указывает начальную точку чтения и должен располагаться в диапазоне 1—2 147 483 647.

Его работа тесно связана с использованием Get # и Put #.

По существу, оператор назван неудачно, так как ничего не ищет, а просто перемещается по команде.

Примеры

Содержание
Создание файла
Проверка существования файла
Запись информации в новый файл
Добавление информации в существующий файл
Построчное считывание файла
Назначение текущей папки

Здесь не стоит разговаривать о микроскопических программах, хотя из приводимых примеров можно извлекать блоки и использовать их в качестве заготовок.

Также не будет полноценных примеров для бездумного копирования.

Многие ситуации содержат схожие требования, но идеальное решение должно состоять из множества функций.
Сейчас их делать не очень хочется, но это запланировано в перспективе.

В любом случае, все примеры полностью работоспособны.

Принципиально важен факт документирования функции с точки зрения возвращаемых значений.
Равно как и описание передаваемых параметров.

Для большинства представляемых примеров используются следующие положения, если не указано иное.

  • Путь должен содержать литерал диска (C:…).
  • Путь не должен заканчиваться косой чертой: «C:ab».
  • Если путь и файл передаются отдельно, то имя файла не должно содержать пути.
  • Все параметры являются обязательными и не могут быть пустыми. Последнее обстоятельство не проверяется.

Создание файла

Данное действие специально вынесено в отдельный заголовок, так как будет базовым для примеров, когда файла ещё нет.
Оно имеет множество особенностей, включая фатальные для хранящейся информации.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Ещё один момент. Добавим программу (фрагмент), которая будет запускать процесс.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Проверка существования файла

Имеет прикладное назначение не только в случае использования низкоуровневых функций.
По существу, нужно в любом программном проекте в качестве условия его запуска.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


Запись информации в новый файл

Разумеется, что в этой ситуации файл нужно не открыть, а создать.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


….

Добавление информации в существующий файл

Казалось бы…
Но первым действием должна быть проверка его наличия, если это не было сделано в программе ранее.


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


….

Построчное считывание файла


Доступ к этим материалам предоставляется только зарегистри­рован­ным пользователям!


….

Назначение текущей папки

Если работа с проектами так или иначе связана с файлами, хранящимися в одной папке, самым простым вариантом будет назначение ее текущей.

Представленный пример имеет формат глобальной функции (доступной для любого проекта), производящей множество проверок.


Доступ к размещенным в этом месте материалам ограничен и предоставляется следующим категориям:
1. Студент I/II курса ВХК РАН. 2. Бывший студент ВХК РАН. 3. Подготовка к ОГЭ. 4. Подготовка к ЕГЭ. 5. VIP-пользователь. 6. Благотворитель.


В принципе, возможна как оптимизация программы, так и ее модернизация или приспособление для других нужд.

Содержание:

  • I. Чтение и запись текстовых файлов
  • II. Работа с типизированными файлами
  • III. Работа с нетипизированными файлами

I. Чтение и запись текстовых файлов

* Задание: Разработайте приложение, которое сохраняет в файл информацию из списка (ListBox) и загружает из файла информацию обратно в список.

Работа с текстовыми файлами в VB

Форма «Работа с файлами»

OpenMode — указывает, как открыть файл при вызове функций для работы с файлами. Следующие режимы:

  • OpenMode.Append — Файл открыт для добавления данных в его конец. Значение по умолчанию.
  • OpenMode.Binary — Файл открыт для двоичного доступа.
  • OpenMode.Input — Файл открыт для чтения.
  • OpenMode.Output — Файл открыт для записи.
  • OpenMode.Random — Файл открыт для произвольного доступа.

Выполнение:

  1. Поместите на форму элементы список ListBox (lst), текстовое поле TextBox (txt), кнопки: btnAdd («Добавить элемент в список»), btnSave («Сохранить в файле»), btnOpen («Загрузить из файла»). Расположите правильно элементы (рисунок).
  2. При нажатии на btnAdd («Добавить элемент в список») в список lst должна добавиться строка, записанная в текстовое окно txt, а само окно при этом должно очиститься. Добавьте код для события click кнопки btnAdd:
1
2
3
4
Private Sub btnAdd_Click(…) Handles btnAdd.Click
lst.Items.Add(txt.Text) ' добавляем текст
txt.Clear() 'чистим текстовое поле
End Sub
  1. По щелчку на кнопке btnSave вся информация со списка должна добавляться во введенный пользователем текстовый файл. Для этого добавьте процедуру для события Click кнопки:
1
2
3
4
5
6
7
8
9
10
11
Private Sub btnSave_Click(…) Handles btnSave.Click
Dim filename As String
Dim i As Integer
 
filename = InputBox("Введите имя файла", "Сохранить файл") 'окно для ввода
FileOpen(1, filename, OpenMode.Output) ' открываем файл для записи
For i = 0 To lst.Items.Count - 1
  PrintLine(1, lst.Items(i)) 'записываем в файл i-ю строку списка
Next
FileClose(1)
End Sub
  1. Событие Click кнопки btnOpen («Загрузить из файла») запрограммируйте таким образом, чтобы в список помещались все строки из файла:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub btnOpen_Click(…) Handles btnOpen.Click
Dim filename, CurStr As String
 
filename = InputBox("Введите имя файла", "Загрузить файл") 'окно для ввода
FileOpen(1, filename, OpenMode.Input) 'открываем файл для чтения
lst.Items.Clear()
While Not EOF(1)
  CurStr = LineInput(1) 'считываем очередную строку
  If CurStr <> "" Then lst.Items.Add(CurStr) 'вносим строку в список
End While
FileClose(1)
End Sub
  1. Запустите приложение, внесите в список lst несколько строк и попытайтесь сохранить их в виде файла (желательно с расширением .txt: например, proba.txt). Если не написан путь к файлу, то файл сохранится в папке /bin/Debug Вашего проекта.

II. Работа с типизированными файлами

В типизированных файлах можно прочитать любую по очереди запись. Добавить новую запись в конец файла.

Задание: Хранение картотеки одинаковых по структуре карточек. Необходимо создать возможность добавления карточки и просмотра карточки по ее номеру.

Выполнение:

Разделим форму условно на две части: в первой части создадим возможность добавления карточки в картотеку, а во второй – просмотр карточки по номеру (см. рисунок):

Работа с типизированными файлами в VB

Форма «Работа с типизированными файлами»

  1. Разместите на форме два элемента управления GroupBox . Установите свойство Text первой группы равным Добавление в картотеку, а второй – Просмотр картотеки.
  2. В группу GroupBox1 добавьте 4 элемента Label и задайте их свойствам Text значения: Имя, Фамилия, Пол, Возраст.

GroupBox — контейнерный элемент, который может служить контейнером для помещенных внутрь него элементов.

  1. В ту же группу поместите 3 элемента TextBox. Их свойствам Text задайте пустые строки. А для свойств Name укажите: для первого элемента – FirstName, второго – LastName, третьего –Age.
  2. Добавьте в первую группу два объекта RadioButton. Для их свойств Name укажите: для первого элемента Male, для второго –Female. Свойство Text для первого укажите – мужской, для второго – женский.
  3. Расположите в группе одну кнопку (button) со свойством Name равным AddButton и свойством Text равным Добавить.
  4. Во второй группе разместите 7 элементов типа Label и пять текстовых полей, задайте значения их свойств в соответствии с Таблицей 12:

Таблица 12

name text
Label5 Текущая карточка
Label6 Имя
Label7 Фамилия
Label8 Пол
Label9 Возраст
txtCardNumber  
txtfirstName  
txtlastName  
txtGender  
txtAge  
  1. Поместите кнопку и задайте ее свойству Name значение ShowButton, а Text Показать.
  2. Посчитаем необходимое количество символов для всей записи: для имени и фамилии выделим по 15 символов, для пола 1 символ, для возраста 3 символа, т.е. всего 34 символа.
  3. Запрограммируйте событие click для кнопки AddButton («Добавить»):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub AddButton_Click(…) Handles AddButton.Click
Dim card As String = ""
 
card += FirstName.Text + Space(15 - Len(FirstName.Text))
card += LastName.Text + Space(15 - Len(LastName.Text))
If Male.Checked = True Then card += "м" Else card += "ж"
card += Age.Text + Space(3 - Len(Age.Text))
FileOpen(1, "cardfile.dat", OpenMode.Random, , , 38) ' одна запись равна 38
FilePutObject(1, card, 1 + LOF(1) / 38) ' указываем позицию для очередной записи
FileClose(1)
 
FirstName.Clear()
LastName.Clear()
Age.Clear()
Male.Checked = True
End Sub

Пояснение: чтобы дополнить некоторую строку S до длины N используется выражение: S+Space(N-Len(S)). Функция Space(K) возвращает строку, состоящую из К пробелов.

Суммарная длина записи равна 38 (15 на имя + 15 на фамилию + 1 на пол +3 на возраст)

FilePutObject(1, card, 1 + LOF(1) / 38): LOF возвращает длину файла; разделив полученное значение на размер записи (38 байт), получаем количество записей; новая запись будет иметь номер, на единицу больший.

  1. Теперь осталось запрограммировать кнопку Showbutton («Показать»):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub showButton_Click(…) Handles showButton.Click
Dim card As String = ""
 
FileOpen(1, "cardfile.dat", OpenMode.Random, , , 38)
FileGetObject(1, card, Val(txtcardNumber.Text))
FileClose(1)
 
txtFirstNAme.Text = Mid(card, 1, 15)
txtLastName.Text = Mid(card, 16, 15)
If Mid(card, 31, 1) = "м" Then
  txtGender.Text = "мужской"
  Else : txtGender.Text = "женский"
End If
txtAge.Text = Mid(card, 32, 3)
End Sub
  1. Запустите и откомпилируйте приложение. Файл cardfile.dat сохраняется в папке …/Bin/Debug.

III. Работа с нетипизированными файлами

Нетипизированные файлы – файлы, не имеющие четкую структуру.

Задание: Перепишите программу для работы с картотекой с использованием нетипизированных файлов.

Выполнение:

  1. Нужно всего лишь переписать процедуру-обработчик события Click для кнопки AddButton и ShowButton.
  2. AddButton:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub AddButton_Click(…) Handles AddButton.Click
Dim gender As String
 
If Male.Checked = True Then gender = "м" Else gender = "ж"
FileOpen(1, "cardfile1.dat", OpenMode.Binary)
FilePutObject(1, FirstName.Text, 1 + LOF(1))
FilePutObject(1, LastName.Text, 1 + LOF(1))
FilePutObject(1, gender, 1 + LOF(1))
FilePutObject(1, Age.Text, 1 + LOF(1))
FileClose(1)
 
FirstName.Clear()
LastName.Clear()
Age.Clear()
Male.Checked = True
End Sub
  1. ShowButton:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub showButton_Click(…) Handles showButton.Click
Dim i As Integer
Dim fName, lName, gender, pAge As String
 
FileOpen(1, "cardfile1.dat", OpenMode.Binary)
For i = 1 To Val(txtcardNumber.Text)
  FileGetObject(1, fName)
  FileGetObject(1, lName)
  FileGetObject(1, gender)
  FileGetObject(1, pAge)
Next
FileClose(1)
 
txtFirstNAme.Text = fName
txtLastName.Text = lName
If gender = "м" Then
  txtGender.Text = "мужской"
  Else : txtGender.Text = "женский"
End If
txtAge.Text = pAge
End Sub
  1. Запустите и отладьте приложение.

Вопросы для самоконтроля:

  1. Объясните особенности работы с типизированными файлами.
  2. Объясните особенности работы с нетипизированными файлами.
  3. Для чего используется функция LOF?

* При использовании материалов обязательна ссылка на источник: Майер С.Ф., «MS Visual Basic 2008» — Учебно-методическое пособие : Южный федеральный университет. – Ростов-на-Дону, 2017. – 92 с.

 

Как правильно вызвать окно проводника, чтобы вывести список файлов определенного расширения?
Например: Ищем все файлы с расширением txt на диске C:/

Попытался использовать следующий код, но выводит только окно поиска.
Не знаю как правильно подставить аргументы
Set oFnd = CreateObject(“Shell.Application”).FindFiles

 

Слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

#2

22.11.2013 14:08:15

Код
Dim dlg As FileDialog, rez
 Set dlg = Application.FileDialog(msoFileDialogFilePicker)
 dlg.AllowMultiSelect = False
 dlg.Title = "Укажите файл для обработки"
 dlg.InitialFileName = "*.txt"
 rez = dlg.Show

например

Живи и дай жить..

 

Ёк-Мок

Пользователь

Сообщений: 1777
Регистрация: 16.01.2013

#3

22.11.2013 14:16:45

или

Код
Dim sFile As String
sFile = Application.GetOpenFilename("Files(*.txt),*.txt", , "Выбрать файл", , Files)

Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.

 

The_Prist

Пользователь

Сообщений: 14245
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Просмотреть все файлы в папке

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Мне нужно вывести окно проводника с результатом поиска.

Если я использую CreateObject(“Shell.Application”).FindFiles, выводиться пустое окно, т.к. не заданы аргументы для поиска (Искомые файлы, папка поиска).

 

SkyPro

Пользователь

Сообщений: 309
Регистрация: 23.07.2013

#6

22.11.2013 14:57:07

Цитата
Мне нужно вывести окно проводника с результатом поиска.

Не получится. У FindFiles нет аргументов. Это просто запуск окна поиска.

SkyPro

 

Николай Шелковников

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

#7

22.11.2013 15:48:41

Нашел похожую процедуру.
Помогите расшифровать аргументы и добавить поиск файлов по маске *.txt

Код
Option Explicit
'API declaration for the windows "Search Results" dialog
Private Declare Function ShellSearch& Lib "shell32.dll" _
        Alias "ShellExecuteA" (ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long)
        
Private Const SW_SHOWNORMAL = 1


Sub ShowWindowsSearchDialog_API()
'   Specified drive to Search
    Const szSDrive As String = "C:"
    
    ShellSearch 0, "find", szSDrive, "", "", SW_SHOWNORMAL
End Sub
 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

Изменено: ikki22.11.2013 16:06:43

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

Когда работаю с аргументом find, выводится ошибка  “No association for file extension”.  В остальных случаях находит  указанный файл (explore,  open,  edit, print), но с маской *.txt не работает.

Как правильно задать аргументы?

 

Юрий М

Модератор

Сообщений: 60706
Регистрация: 14.09.2012

Контакты см. в профиле

А чем не устраивает вариант Слэна?

 

SkyPro

Пользователь

Сообщений: 309
Регистрация: 23.07.2013

Чилавеку нужна именна акно поиска вендовскае.

Подозреваю, что суть в использовании виндовского окна поиска.

Изменено: SkyPro22.11.2013 20:21:14

 

Да, необходимо вызвать окно проводника для поиска файлов

 

Юрий М

Модератор

Сообщений: 60706
Регистрация: 14.09.2012

Контакты см. в профиле

Окно проводника и окно поиска – разные вещи.

 

Мне нужно окно вызываемое вот этим кодом Set oFnd = CreateObject(“Shell.Application”).FindFiles

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#15

23.11.2013 11:58:46

Как вариант, не без проблем (ниже почему). Нужно подключить бибилиотеку Miscrosoft Shell Controls and Automation.

Код
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Public Sub ShowFilteredWindow()
    Const FolderPath As String = "c:projects"
    Dim pShell As New Shell32.Shell
    Dim pWin As Object, shFolderView As Shell32.ShellFolderView
    Dim pFolder As Shell32.Folder3
    
    Set pFolder = pShell.Namespace(FolderPath)
    pShell.Explore FolderPath
    Sleep 200
    For Each pWin In pShell.Windows
        Set shFolderView = pWin.document
        'узкое место, такая папка в проводнике может быть открыта не один раз
        If shFolderView.Folder.Title = pFolder.Title Then
            shFolderView.FilterView "*.txt"
        End If
    Next
End Sub
 

Библиотеку подключил, на строке shFolderView.FilterView “*.txt выдает ошибку: “Object doesn´t support this property or method”.

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Я тестировал в win7 64bit, Excel 2010 32bit. Если у вас  win xp… насколько помню, там поиск файлов не входил в состав проводника. Посмотреть смогу только в понедельник.
Простите за любопытство, но зачем нужно использовать именно проводник?

Изменено: anvg23.11.2013 16:58:10

 

В нашей организации сотрудники привыкли искать отсканированные документы через проводник.
Ищем документ в реестре сформированном в Excel, сверяем с отсканированной копией.
Все документы сложенны по месяцам и для наглядности проще отсеять документы по типу. Для этого нужно научиться вызывать окно проводника с поиском и искать с определенными условиями.    

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#19

23.11.2013 18:09:37

Цитата
В нашей организации сотрудники привыкли

имхо

: у сотрудников в вашей организации сложились плохие привычки. у данного типа задач есть гораздо более приятные и “вкусные” варианты решения.
раз уж у вас есть реестр в Excel и соответствующие файлы с текстами, то гораздо проще. правильнее и удобнее организовать гиперссылки из этого самого реестра на эти самые файлы.
правда, место хранения файлов желательно организовать правильно, раз и навсегда – например, разложить по папкам-контрагентам или датам или ответственным сотрудникам и т.д.
если же и это невозможно и ваши сотрудники “привыкли” таскать файлы туда-сюда – то и это не такая уж большая проблема, особенно в случае наличия какой-либо системы в наименованиях таких файлов – обычный поиск средствами VBA с этим справится достаточно легко.

хотя, конечно. хозяин – барин… ;)

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

Все это реализовано, но для тех кто не хочет менять привычки хочу сделать поиск через проводник.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#21

23.11.2013 18:24:25

Цитата
для тех кто не хочет менять привычки

существуют дисциплинарные взыскания(например для Украины- Кзот):
1) Выговор;
2) Увольнение.
Думаю, уже после первого все дружно “захотят”! Если кто дождется второго, то на его место того, кто хочет. У себя дома пусть хотят. На работе надо работать.

Я сам – дурнее всякого примера! …

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#22

23.11.2013 18:27:01

Цитата
На работе надо работать.

кстати, да.
неэффективный способ работы просто потому, что “мне так нравится” – это неправильно.
тем более – при наличии реализованного эффективного варианта.

но в реальной жизни бывают исключения – “большие” начальники. :(

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Точно, Саш. Но! “”большие” начальники” в большинстве своем малосведущи в Эксе, ВБА и иже.. И если авторитетный в той организации знаток Экса скажет: “А низзя! И чревато!”, то в подавляющем числе случаев получится см. пост №21[IMG]
На самом деле, в бытность мою инженером, девчата(моего возраста и старше) дружили со мной, чтоб я им помогал не учиться информационным технологиям. Я писал им программки, иногда выполнял их работу. Но это было в 1999-2001гг. Делаем выводы, время не стоит и работодатели не хотят заниматься благотворительностью на собственных производствах. Да и талантливой(и при этом невостребованной) молодежи хватает. Поэтому считаю пост №21 не противоречащим нормальной, человеческой морали.

Я сам – дурнее всякого примера! …

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

В WinXP как то всё сложно. Может и Find по-умолчанию и Windows Desktop Search выскочить при использовании CreateObject(“Shell.Application”).FindFiles (в зависимости что стоит).
Так что, может вам проще сделать форму с ListBox с двумя колонками, в первую видимую выводить имена файлов, а в скрытой колонке хранить путь и имена файлов, и по щелчку на имени файла открывать его в блокноте, организовав поиск файлов по заданному пути через тот же Dir?

Изменено: anvg25.11.2013 03:28:54

 

У меня стоит WinXP, по умолчанию запускается  Find.

 

Николай Шелковников

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

#26

27.11.2013 15:42:21

Без вариантов?

Последнее обновление: 30.10.2015

Как правила, работа с файлами в большинстве своем заключается в чтении и записи файлов. Подобной функицональностью обладает
класс FileStream. Он представляет собой поток, связанный с файлом. Рассмотрим его ключевые свойства и методы:

  • Свойство Length возвращает длину потока в байтах

  • Свойство Position возвращает текущую позицию в потоке

  • Метод Read читает данные из файла в массив байтов. Он принимает три параметра:
    Read(array As Byte(), offset As Integer, count As Integer) As Integer и возвращает количество успешно считанных байтов

    Параметр array представляет массив байтов, в который считываются данные из потока

    Параметр offset представляет смещение в байтах в массиве array, начиная с которого в массив array будут помещаться считанные байты

  • Параметр count – максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то
    все они будут считаны.

  • Метод Seek(offset As Long, origin As SeekOrigin) As Long устанавливает позицию в потоке со смещением на количество байт,
    указанных в параметре offset

  • Метод Write записывает данные из массива байтов в файл. Принимает три параметра:
    Write(array As Byte(), offset As Integer, count As Integer)

    array представляет массив байтов, откуда будут браться данные для записи в файла

    Параметр offset представляет смещение в байтах в массиве array, откуда начинается запись байтов в поток

  • Параметр count – максимальное число байтов, предназначенных для записи

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

В то же время при работе с различными бинарными файлами, имеющими определенную структуру FileStream может быть очень даже полезен для извлечения
определенных порций информации и ее обработки.

Посмотрим на примере считывания-записи в текстовый файл:

Imports System.IO

Module Module1

    Sub Main()

        Console.WriteLine("Введите строку для записи в файл:")
        Dim text As String = Console.ReadLine()

        'запись в файл
        Using fstream As New FileStream("C:SomeDirnonamenote.txt", FileMode.OpenOrCreate)
            'преобразуем строку в байты
            Dim array As Byte() = System.Text.Encoding.Default.GetBytes(text)
            'записываем массив байтов в файл
            fstream.Write(array, 0, array.Length)
            Console.WriteLine("Текст записан в файл")
        End Using


        'чтение из файла
        Using fstream As FileStream = File.OpenRead("C:SomeDirnonamenote.txt")
            'преобразуем строку в байты
            Dim array As Byte() = New Byte(fstream.Length) {}
            'чтение данных
            fstream.Read(array, 0, array.Length)
            'декодируем байты в строку
            Dim textFromFile As String = System.Text.Encoding.Default.GetString(array)
            Console.WriteLine("Текст из файла: {0}", textFromFile)
        End Using

        Console.ReadLine()
    End Sub

End Module

Разберем этот пример. И при чтении, и при записи применяется выражение Using....End Using.
Данная конструкция позволяет создать объект, который реализует интерфейс IDisposable. И при завершении выполнения кода в этом блоке
у данного объекта вызывается метод Dispose, и, таким образом, объект уничтожается. В данном случае
в качестве такого объекта служит переменная fstream.

Общий синтаксис конструкции идентичен объявлению переменной, только вместо оператора Dim идет слово Using, а весь блок ззаканчивается
выражением End Using

Мы могли бы не использовать конструкцию Using, тогда в этом случае нам нужно бы было явным образом закрыть поток с помощью метода Close:

Dim fstream As New FileStream("C:SomeDirnonamenote.txt", FileMode.OpenOrCreate)
Dim array As Byte() = System.Text.Encoding.Default.GetBytes(text)
fstream.Write(array, 0, array.Length)
fstream.Close()

Объект fstream создается двумя разными способами: через конструктор и через один из статических методов класса File.

Здесь в конструктор передается два параметра: путь к файлу и перечисление FileMode. Данное перечисление указывает на режим доступа к
файлу и может принимать следующие значения:

  • Append: если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается.
    Файл открывается только для записи.

  • Create: создается новый файл. Если такой файл уже существует, то он перезаписывается

  • CreateNew: создается новый файл. Если такой файл уже существует, то он приложение выбрасывает ошибку

  • Open: открывает файл. Если файл не существует, выбрасывается исключение

  • Create: создается новый файл. Если такой файл уже существует, то он перезаписывается

  • OpenOrCreate: если файл существует, он открывается, если нет – создается новый

  • Truncate: если файл существует, то он перезаписывается. Файл открывается только для записи.

Статический метод OpenRead класса File открывает файл для чтения и возвращает объект FileStream.

Класса FileStream также имеет ряд перегруженных версий конструктора, которые позволяют задать дополнительные параметры потока. Все эти версии можно посмотреть на msdn.

Когда мы работаем с текстовыми файлами, то при записи и при чтении применяется объект кодировки Encoding.Default из пространства имен System.Text.
В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и
GetString для преобразования массива байтов в строку.

В итоге введенная нами строка записывается в файл C:SomeDirnonamenote.txt. Но по сути это не текстовый, а бинарный файл,
хотя если мы в него запишем только строку, то сможем в любом текстовом редакторе посмотреть файл в удобочитаемом виде.
Но если мы в него запишем случайные байты, то у нас могут возникнуть проблемы с его пониманием. Например:

fstream.WriteByte(13)
fstream.WriteByte(103)

Поэтому для работы непосредственно с текстовыми файлами предназначены отдельные классы – StreamReader и StreamWriter.

Добавить комментарий