Закрыть файл открытый с помощью инструкции open можно с помощью команды

Работа с файлами в VBA

Типы файлов в VBA

В VBA допустима работа с тремя типами текстовых файлов. .

Файл

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

последовательного

разделенных специальными символами. Чтение и запись в файл

доступа

производится построчно

Файл произвольного

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

доступа

при его открытии. Это позволяет локализовать любую запись в файле по

ее номеру

Бинарный файл

Является частным случаем файла произвольного доступа. Размер записи

в бинарном файле считается равным 1 байту

Открытие и закрытие файла

Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.

Open Разрешает выполнение операций ввода/вывода при работе с файлом. Синтаксис:

Open Путь For Режим [Access Доступ] [Блокировка] As [ # ] НомерФайла [Lеn=Длина]

Путь — строковое выражение, указывающее имя файла

Режим — устанавливает режим работы с файлом. Допустимые Значения: Append, Binary, Input, Output или Random

Доступ — устанавливает операции, разрешенные с открытым файлом. Допустимые значения: Read, Write или Read Write

Блокировка — устанавливает операции, разрешенные с открытым файлом другим процессам. Допустимые значения:

Shared, Lock Read, Lock Write и Lock Read Write и номер Файла — допустимый номер файла. Число в интервале от 1 до 255. Обратите внимание на то, что параметру Номер-Файла предшествует символ #. Значение номерФайла нельзя изменять, пока файл открыт. Но при следующем открытии файла номер Файла может быть другим числом длина — число, меньшее либо равное 32 767 (байт). Для файлов, открытых в

режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов Про инструкцию open важно также знать, что во время ее работы VBA также резервирует файловый буфер в памяти компьютера для ускорения процесса записи и считывания (прямое записывание информации на диск может существенно замедлить выполнение программы, что особенно заметно при работе с большими файлами). Максимальное число файловых буферов устанавливается в системном файле Config.sys

Close Завершает операции ввода/вывода с файлом, открытым с помощью инструкции open. Эта инструкция ‘очищает буфер и указывает операционной системе обновить FAT (таблицу размещения файлов). Важно, чтобы каждый файл по завершении работы с ним был закрыт, иначе это может привести к частичной потере информации.

Синтаксис:

Close [СписокНомеровФайлов] Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где номерФайла представляет любой допустимый номер файла: [[#] номерФайла] [, [#] номерФайла] …

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

На диск, открытых с помощью инструкции Open

FreeFile Функция возвращает доступный номер, который может использоваться в инструкции

Open

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

Open «Первый» For Binary Access Write As #1 Close #1

Ввод данных в файл последовательного доступа

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

Print

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

Print #НомерФайла, [СписокВывода]

номерФайла — номер файла О слисокВывода — выражение (или список

выражений), записываемое в файл. В аргументе СписокВывода разделителем

списка выводимых выражений является «;» (данные выводятся подряд) или «,»

(данные выводятся по зонам). Кроме того, в аргументе СписокВывода допускается

использование функций Spc и таь:

o spc(n) — используется для вставки п пробелов в файл

o Tab(n) — устанавливает курсор в столбец с номером n

Write

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

от инструкции Print, инструкция write вставляет запятые между элементами и заключает

строки в кавычки по мере записи их в файл.

Синтаксис:

Write #НомерФайла, [СписокВывода]

НомерФайла — номер файла

СписокВывода — выражение или список выражений, записываемых в файл

Данные, записанные с помощью инструкции write, обычно считываются из файла с

помощью инструкции input

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

Sub ПримерИспользования Print Open «С:Новый» For Output As II

Печатает текст в файл ‘ Print #1, «Тест»

Печатает пустую строку в файл

Print #l,

Печатает в двух зонах печати

Print #1, «Зона 1»; Tab;

«Зона 2» ; Spc(3) ;

«3 пробела»

Close #1 End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым: Тест

Зона 1 Зона 2 3 пробела

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

Достeпа при помощи инструкции Write.

Sub ПримерИспользованияwriteе Open «ЕщеПример»

For Output As #1

Write #1, «Пример»; «использования»

Write #l, «инструкции»;

Write #1, «Write» x = 1

Write #1, «Число»;

х Close #1

End Sub

Результатом описанных выше инструкций будет файл со следующим содержимым:

«Пример»,»использования» «инструкции»,»Write» «Число»,1

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

Пример ислользования Write вторая инструкция write специально заканчивается знаком «;» Это обеспечивает вывод данных третьей инструкцией write в ту же строку файла, в которую выводила вторая инструкция.

Вывод данных из файла последовательного доступа

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

Input #

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

присваивает их переменным. Данные, считываемые с помощью инструкции input

I, обычно записываются в файл с помощью инструкции Write #.

Синтаксис:

Input #НомерФайла, СписокПеременных

номерФайла — номер файла

СписокПеременных — список переменных, которым следует присвоить

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

запятыми

Line Input #

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

ее переменной типа string. Данные, считываемые с помощью инструкции Line

input I, как правило, записываются в файл с помощью инструкции Print #.

Синтаксис:

Line Input #НомерФайла, ИмяПеременной

Синтаксис инструкции Line Input1 содержит следующие элементы:

НомерФайла — номер файла

ИмяПеременной — имя переменной типа Variant или String

Функция

Возвращает значение типа string, содержащее символы из файла, открытого в

Input

режиме input или Binary. Функция input считывает данные, записываемые в файл

с помощью инструкции Print # или Put.

Синтаксис:

Input (Число, [#] НомерФайла)

Число задает число возвращаемых символов. Если аргумент Число равен

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

ФУНКЦИЯ

Функция возвращает значение True при достижении конца файла.

EOF

Синтаксис:

EOF (НомерФайла} При последовательном считывании информации из файла

часто используется следующий цикл:

Do While Not EOF(l) Loop

или, для тех пользователей, кто предпочитает инструкцию While — Wend

инструкции Do While — Loop, следующий эквивалентный цикл:

While Not EOF (I) Wend

Приведем пример использования инструкции input # для считывания данных из файла. В этом примере предполагается, что на диске существует файл группа Экономистов, содержащий информацию о студентах. Файл был создан при помощи инструкции write # и состоит из двух столбцов, в первом из которых указывается фамилия, а во втором — оценка студента. Для удобства работы с информацией введен пользовательский тип Студенты. Процедура пример использования Input последовательно считывает фамилии и оценки из файла и выводит их в ячейки первого и второго столбца рабочего листа.

Туре Студенты

‘ Фамилия As String * 20

Оценка As String * 3 End Type

Sub ПримерИспользованияInput() Dim Студент As Студенты

Open «ГруппаЭкономистов»

For Input As 12 i = 1

Do While Not EOF(2) With Студент

Input #2, .Фамилия, .Оценка

Cells(i, 1).Value = .Фамилия

Cells(i, 2).Value = .Оценка End With

i = i + 1 Loop Close #2

End Sub

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

.окна.

Private Sub UserForm_Initialize() Dim Студент As String

Open «ГруппаЭкономистов» For Input As #1

i = 1

With ListBoxl

.Clear Do While Not EOF(l) Line Input 11, Студент

.Addltem Студент i = i + 1 Loop Close #l

End With

End Sub

Работа с файлом произвольного доступа

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

Put Записывает содержимое переменной в файл произвольного доступа. Синтаксис:

Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной

НомерФайла — номер файла

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

Seek

ИмяПеременной — имя переменной, содержащей данные, которые следует записать в файл

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

Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной

НомерФайла — номер файла

НомерЗаписи — номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение Имяпеременной — имя переменной, в которую следует поместить считанные данные

Seek Функция возвращает значение типа Long, определяющее текущее положение указателя чтения/записи внутри файла, открытого с помощью инструкции Open. Синтаксис:

Seek (НомерФайла)

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

Синтаксис:

LOF (НомерФайла)

FileLen Возвращает значение типа Long, содержащее размер файла в байтах. Синтаксис:

FileLen (Путь )

Как видно из приведенного в предыдущем разделе примера для считывания информации при помощи инструкции input # из файла группаЭкономистов, файл последовательного доступа иногда удобно задавать как последовательность записей (в данном случае, записей о студентах), причем каждая из записей формируется из группы полей (в данном случае из полей Фамилия и оценка). Отметим, что такая группировка по записям не является чем-то присущим файлам последовательного доступа. Это просто подход, позволяющий упростить процесс последовательного считывания записей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями (запятыми или специальными символами, обозначающими переход на новую строку).

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

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

На практике бывает удобно создавать отдельный файл, в котором хранится информация о структуре файла произвольного доступа: структура записи, ее длина и заголовки полей. Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.

Приведем один, пример работы с файлом произвольного доступа группа Экономистов, который имеет ту же структуру, что и в предыдущем примере. Файл создается с помощью процедуры записьвоайл, которая последовательно считывает данные из первого и второго столбца рабочего листа и затем вводит их в файл. В этой процедуре число вводимых записей фиксировано и равно 5. Процедура Считывание из файла производит обратное действие — считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа. Интересной особенностью файла произвольного доступа является то, что при работе с ним можно определить число записей не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при помощи которой файл был создан, размер открытого файла возвращается функцией LOF, а еще не

открытого — функцией FileLen. В рассматриваемом случае число записей в файле равно

LOF(l) / Len(Студент).

Туре Студенты

Фамилия As String * 20 Оценка As String * 3 End Type

Sub ЗаписьВФайл()

Dim Студент As Студенты

Dim i As Integer

Open «ГруппаЭкономистов»

For Random As #1 Len = Len(Студент) For i = 1 To 5

With Студент

.Фамилия = Cells(i, 1).Value .Оценка = Cells(i, 2).Value End With

Put #1, i, Студент Next i

Close #1

End Sub ‘

Sub СчитываниеИзФайла() Dim Студент As Студенты

Dim i As Integer

Dim n As Integer

Open «ГруппаЭкономистов»

For Random As #1 Len = Len(Студент) n = LOF(l) / Len(Студент)

For i = 1 To n

Get #1, i, Студент

With Студент

Cells (i, 3) .Value = .Фамилия Cells(i, 4).Value = .Оценка End With

Next i Close #1 End Sub

Наиболее употребляемые инструкции и функции при работе с файлами

Приведем наиболее часто употребляемые инструкции и функции для работы с файлами.

ChDir

Изменяет текущую папку. Синтаксис:

ChDir путь

ChDrive

Изменяет текущий диск. Синтаксис:

ChDrive диск Например, ChDrive «D»

CurDir

Функция возвращает текущую папку

FileAttr

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

помощью инструкции open. Возвращаемые значения: 1 (для режима input), 2

(output), 4 (Random), 8 (Append) и 32 (Binary).

Синтаксис:

FileAttr (НомерФайла, Тип)

НомерФайла — допустимый номер файла

Тип — число, указывающее характер возвращаемых данных. Если тип

установлен равным 1 , то функция FileAttr возвращает значение,

указывающее режим работы файла

GetAttr

Возвращает значение типа integer, определяющее атрибуты файла, каталога

или папки. Значение, возвращаемое функцией GetAttr, является суммой

констант, приведенных в табл. 13.1.

Синтаксис:

GetAttr (путь)

SetAttr

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

Синтаксис:

SetAttr pathname, attributes

Атрибуты в аргументе attributes определяются как сумма констант из табл. 13.1

FileCopy

Копирует файл.

Синтаксис:

FileCopy source, destination

Аргументы:

source — строковое выражение, указывающее имя копируемого файла

destination — строковое выражение, указывающее имя результирующего

файла. Аргумент destination может содержать имя каталога или папки и

диска

FileDateTime

Функция возвращает дату и время последнего изменения файла.

Синтаксис:

FileDateTime (путь )

Kill

Удаляет существующий файл.

Синтаксис:

Kill путь

В аргументе путь допустимо использование символой (*) и (?) для удаления

нескольких файлов по маске.

MkDir

Создает новую папку.

Синтаксис:

MkDir путь

RmDir

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

Синтаксис:

RmDir путь

Табл. 13.1. Константы атрибутов файла

Константа

Значение

Описание

vbNormal

0

Обычный

vbReadOnly

i

Только чтение

vbHidden

2

Скрытый

vbSystem

4

Системный

vbDi rector у

16

Каталог или папка

vbArchive

32

Файл был изменен после последнего

резервирования

Объект FileSearch

Объект FileSearch обладает функциональными возможностями диалогового окна Открытие документа (Open), отображаемого на экране_посредством выбора команды Файл, Открыть (File, Open). Объект FileSearch входит в объект Application и иерархически включает в себя

(рис. 13.1):

Семейство FoundFiles, которое является списком всех файлов, возвращаемых в результате поиска

Семейство PropertyTests, которое является списком всех критериев поиска

Рис. 13.1. Иерархическая структура объекта FileSearch

Объект FileSearch возвращается свойством FileSearch объекта Application.

Объект FileSearch имеет следующие два метода.

Execute Поиск специфицированных файлов. Синтаксис:

Execute (SortBy, SortOrder, AlwaysAccurate)

Аргументы:

SortBy — устанавливает способ сортировки файлов. Допустимые значения: msoSortbyFileName, msoSortbyFileType, msoSortbyLastModif led и msoSortbySize

SortOrder — устанавливает порядок сортировки файлов.

Допустимые значения: msoSortOrderAscending и msoSort Order Descending AiwaysAccurate — допустимые значения: True (поиск среди измененных

файлов) и False (в противном случае)

NewSearch Устанавливает критерии, используемые при поиске по умолчанию

Приведем наиболее часто применяемые свойства объекта FileSearch.

FileName

Устанавливает имя файла для поиска. Допустимо использование

символов (*) и (?)

FileType

Задает тип файла для поиска. Допустимые значения:

msoFileTypeAHFiles,

msoFileTypeBinders,

msoFile-TypeDatabases,

msoFileTypeExcelWorkbooks, msoFi-leTypeOff ice Files, ms о FileType Power

Point Presentations, msoFileTypeTemplates И msoFileTypeWordDocuments

Lookln

Задает папку для поиска файла

SearchSubFolders

Допустимые значения: True (поиск также проводить в поддиректориях) и

False (в противном случае)

Следующий пример позволяет в поле со списком диалогового окна вывести список всех файлов текущей папки:

Private Sub UserForm_Initialize() ComboBoxl.Clear With Application.FileSearch

.FileName = «*.xls» .SearchSubFolders = False If .Execute(SortBy:=msoSortByFileName, sortorder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count ComboBoxl.Addltem .FoundFiles(i)

Next i

End If End With End Sub

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

Private Sub UserForm_Initialize() Dim ИмяПапки As String

Dim ИмяФайла As String Dim ДлинаПути As Integer

ComboBoxl.Clear ИмяПапки = CurDir ДлинаПути = Len(ИмяПапки) With Application.FileSearch .FileName = «*.xls»

.SearchSubFolders = False

If .Execute (SortBy:=msoSortByFileName, sortorder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count

ИмяФайла = Right(.FoundFiles(i), Len(.FqundFiles(i)) — ДлинаПути — 1) ComboBoxl.Addltem ИмяФайла

Next i

End If End With End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Содержание

Введение
Работа с дисками и папками, путь
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. Благотворитель.


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

Эта статья посвящена работе с файлами (вводу/выводу) в Python: открытие, чтение, запись, закрытие и другие операции.

Файл — это всего лишь набор данных, сохраненный в виде последовательности битов на компьютере. Информация хранится в куче данных (структура данных) и имеет название «имя файла» (filename).

В Python существует два типа файлов:

  1. Текстовые
  2. Бинарные

Текстовые файлы

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

Текст может храниться в двух форматах: (.txt) — простой текст и (.rtf) — «формат обогащенного текста».

Бинарные файлы

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

Они хранятся в формате .bin.

Любую операцию с файлом можно разбить на три крупных этапа:

  1. Открытие файла
  2. Выполнение операции (запись, чтение)
  3. Закрытие файла

Открытие файла

Метод open()

В Python есть встроенная функция open(). С ее помощью можно открыть любой файл на компьютере. Технически Python создает на его основе объект.

Синтаксис следующий:

f = open(file_name, access_mode)

Где,

  • file_name = имя открываемого файла
  • access_mode = режим открытия файла. Он может быть: для чтения, записи и т. д. По умолчанию используется режим чтения (r), если другое не указано. Далее полный список режимов открытия файла
Режим Описание
r Только для чтения.
w Только для записи. Создаст новый файл, если не найдет с указанным именем.
rb Только для чтения (бинарный).
wb Только для записи (бинарный). Создаст новый файл, если не найдет с указанным именем.
r+ Для чтения и записи.
rb+ Для чтения и записи (бинарный).
w+ Для чтения и записи. Создаст новый файл для записи, если не найдет с указанным именем.
wb+ Для чтения и записи (бинарный). Создаст новый файл для записи, если не найдет с указанным именем.
a Откроет для добавления нового содержимого. Создаст новый файл для записи, если не найдет с указанным именем.
a+ Откроет для добавления нового содержимого. Создаст новый файл для чтения записи, если не найдет с указанным именем.
ab Откроет для добавления нового содержимого (бинарный). Создаст новый файл для записи, если не найдет с указанным именем.
ab+ Откроет для добавления нового содержимого (бинарный). Создаст новый файл для чтения записи, если не найдет с указанным именем.

Пример

Создадим текстовый файл example.txt и сохраним его в рабочей директории.

Текстовый файл пример

Следующий код используется для его открытия.

f = open('example.txt','r')  # открыть файл из рабочей директории в режиме чтения
fp = open('C:/xyz.txt','r')  # открыть файл из любого каталога

В этом примере f — переменная-указатель на файл example.txt.

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

>>> print(*f) # выводим содержимое файла
This is a text file.
>>> print(f) # выводим объект
<_io.TextIOWrapper name='example.txt' mode='r' encoding='cp1252'>

Стоит обратить внимание, что в Windows стандартной кодировкой является cp1252, а в Linux — utf-08.

Закрытие файла

Метод close()

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

Существуют следующие способы:

Способ №1

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

f = open('example.txt','r')
# работа с файлом
f.close()

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

Способ №2

Также можно написать try/finally, которое гарантирует, что если после открытия файла операции с ним приводят к исключениям, он закроется автоматически.

Без него программа завершается некорректно.

Вот как сделать это исключение:

f = open('example.txt','r')
try:
   # работа с файлом
finally:
   f.close()

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

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

Способ №3

Инструкция with

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

В таком случае инструкция close не нужна, потому что with автоматически закроет файл.

Вот как это реализовать в коде.

with open('example.txt') as f:
    # работа с файлом

Чтение и запись файлов в Python

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

Функция read()

Функция read() используется для чтения содержимого файла после открытия его в режиме чтения (r).

Синтаксис

file.read(size)

Где,

  • file = объект файла
  • size = количество символов, которые нужно прочитать. Если не указать, то файл прочитается целиком.

Пример

>>> f = open('example.txt','r')
>>> f.read(7)  # чтение 7 символов из example.txt
'This is '

Интерпретатор прочитал 7 символов файла и если снова использовать функцию read(), то чтение начнется с 8-го символа.

>>> f.read(7)  # чтение следующих 7 символов
' a text'

Функция readline()

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

Пример

Создадим файл test.txt с нескольким строками:

This is line1.
This is line2.
This is line3.

Посмотрим, как функция readline() работает в test.txt.

>>> x = open('test.txt','r')
>>> x.readline()  # прочитать первую строку
This is line1.
>>> x.readline(2)  # прочитать вторую строку
This is line2.
>>> x.readlines()  # прочитать все строки
['This is line1.','This is line2.','This is line3.']

Обратите внимание, как в последнем случае строки отделены друг от друга.

Функция write()

Функция write() используется для записи в файлы Python, открытые в режиме записи.

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

Синтаксис

file.write(string)

Пример

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

>>> f = open('xyz.txt','w')  # открытие в режиме записи
>>> f.write('Hello n World')  # запись Hello World в файл
Hello
World
>>> f.close()  # закрытие файла

Переименование файлов в Python

Функция rename()

Функция rename() используется для переименовывания файлов в Python. Для ее использования сперва нужно импортировать модуль os.

Синтаксис следующий.

import os
os.rename(src,dest)

Где,

  • src = файл, который нужно переименовать
  • dest = новое имя файла

Пример

>>> import os
>>> # переименование xyz.txt в abc.txt
>>> os.rename("xyz.txt","abc.txt")

Текущая позиция в файлах Python

В Python возможно узнать текущую позицию в файле с помощью функции tell(). Таким же образом можно изменить текущую позицию командой seek().

Пример

>>> f = open('example.txt')  # example.txt, который мы создали ранее
>>> f.read(4)  # давайте сначала перейдем к 4-й позиции
This
>>> f.tell()  # возвращает текущую позицию
4
>>> f.seek(0,0)  # вернем положение на 0 снова

Методы файла в Python

file.close() закрывает открытый файл
file.fileno() возвращает целочисленный дескриптор файла
file.flush() очищает внутренний буфер
file.isatty() возвращает True, если файл привязан к терминалу
file.next() возвращает следующую строку файла
file.read(n) чтение первых n символов файла
file.readline() читает одну строчку строки или файла
file.readlines() читает и возвращает список всех строк в файле
file.seek(offset[,whene]) устанавливает текущую позицию в файле
file.seekable() проверяет, поддерживает ли файл случайный доступ. Возвращает True, если да
file.tell() возвращает текущую позицию в файле
file.truncate(n) уменьшает размер файл. Если n указала, то файл обрезается до n байт, если нет — до текущей позиции
file.write(str) добавляет строку str в файл
file.writelines(sequence) добавляет последовательность строк в файл

6. Закрыть файл, открытый с помощью инструкции Open, можно с помощью команды …

FreeFile

Get

Reset

FileClose

Close

Break

Del

Kill

7. Вариант правильного описания процедуры на языке программирования VBA: …

1

2

3

8. Если заполнить массив 10х10 случайными целыми числами от 1 до 10, получим запись: …

1

2

3

4

9. Вид файла определяет в программе …

применяемые символы

применяемые функции

применяемые операторы

способ хранения информации в файле

внешний вид электронной страницы

10. Блок кода, который будет выполняться всякий раз при вызове его по имени, – это …

11. В качестве параметра в процедуре, описанной следующим образом (см. ниже) Sub (Optional ByRef MyParam() As Long), …

передается целочисленная переменная

передается ссылка на целочисленную переменная

передается ссылка на массив

передаются значения элементов массива

12. Если сгенерировать случайным образом 5 целых значений для массива объявленного как Dim mas (5) As Integer, получим запись: …

1

2

3

4

13. Массив Dim MyArrayA(10, 1) As Single содержит …

10 строк и 1 столбец типа Single

10 строк и 1 столбец

11 строк и 2 столбца типа Single

11 строк и 1 столбец типа Single

14. Массив, объявленный как Dim MyArrayA(30) As Single, содержит …

30 элементов

1 элемент

31 элемент

бесконечное количество элементов

произвольное количество элементов

15. Найти все файлы, находящиеся в корневой директории диска C, поможет следующий фрагмент кода: …

1

2

3

16. Написать программу ввода с клавиатуры фамилии и возраста и записать это в файл произвольного доступа поможет следующий фрагмент кода: …

1

2

3

4

17. Неверно, что функции языка VBA работают с …

бинарными файлами

файлами индексно-последовательного доступа

файлами последовательного доступа (текстовыми файлами)

файлами произвольного доступа

18. Область использования процедуры Public Sub MyProg(N As Long) – …

текущий модуль

все открытые проекты

все модули проекта

текущая процедура

19. Оператор «Option Base 1» на языке программирования VBA …

позволяет задать двойную точность для вычислений

требует обязательного объявления всех переменных в программе

позволяет не объявлять переменные в программе

назначает режим отладки программы

объявляет, что индексы всех массивов в модуле начинаются с 1

20. Определение факта достижения конца файла выполняет команда

FileAttr

FileLen

EOF

GetAttr

Close

LOF

21. Определи правильную последовательность шагов поиска минимального элемента в матрице:

1 проводится сравнение текущего элемента с минимумом

2 если текущий элемент меньше минимума, то минимуму присваивается значение текущего элемента

3 начало внутреннего цикла от 1 до числа столбцов

4 начало внешнего цикла от 1 до числа строк

5 индексам минимального элемента присваиваются значения текущего элемента

6 индексы минимального элемента инициализировать 1

7 минимуму присваивается значение первого элемента

22. Определить номер свободного канала для открытия файла можно с помощью команды …

FileLen

FileCopy

Get

FreeFile

FileAttr

23. Переопределяет размерность массива оператор …

Dim

ReDim

Array

ReSize

24. Правильное объявление процедуры: …

Private Sub MyProg () As Integer

Private Function MyProg ()

Public Sub MyProg(N As Integer)

Private Sub MyProg()

Public Function MyProg(N As Integer) As Integer

25. Правильное объявление функции: …

Public Sub MyProg(N As Integer)

Private Sub MyProg()

Public Function MyProg(N As Integer) As Integer

Private Function MyProg ()

Private Function MyProg () As Integer

26. Процедуре описанной Sub (Optional ByRef MyParam() As Long) передается в качестве такого параметра, как …

переменная MyParam типа Long

массив MyParam типа Long

ссылка на переменную MyParam

ссылка на массив MyParam

27. Работа с внешними текстовыми файлами в системе VBA включает в себя …

копирование файлов, удаление неиспользуемых файлов, перемещение файлов с одного диска на другие и создание или удаление каталогов диска

просмотр списка файлов в папке, определение размера файла или даты и времени, когда файл был модифицирован

подключение внешних файлов

сохранение данных в файлах MS Office

поиск файлов в директориях, открытие, сохранение файлов

28. Сопоставляя процедуру и функцию, можно утверждать, что …

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

процедура лишь выполняет какие-либо действия, но ничего в точку вызова не возвращает

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

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

29. Сопоставляя файлы с последовательным и с произвольным доступом, можно утверждать, что …

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

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

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

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

30. Упорядоченная последовательность величин, обозначаемая одним именем, называется …

31. Установите соответствие действий с файлами и того, кто совершает эти действия:

A. Открытие

B. Обработка

C. методы VBA

D. методы VBA

32. Цикл, выполняемый, если верно условие, заданное на входе в цикл, – это …

регулярный цикл

цикл с постусловием

цикл с предусловием

33. Цикл, приведенный ниже, …

выполнится 1 раз

это бесконечный цикл

выполнится 0 раз

выполнится 10 раз

34. Установить соответствие команды на языке VBA и ее описания:

A. Dim ArrDBL() As Single

B. ReDim ArrDBL(2, 9)

C. ReDim ArrDBL(3, 7)

D.ReDim Preserve ArrDBL(1 To 3, 1 To 5)

E.объявляет динамический массив

F.делает массив двумерным

G. изменяет размер двумерного массива

H. изменяет последний размер массива, сохраняя содержимое

35. Фрагмент кода, приведенный ниже, выполняет …

поиск максимального элемента массива и его номера

только поиск максимального элемента массива

поиск минимального элемента массива и его номера

только поиск минимального элемента массива

поиск элемента массива, имеющего значение, равное 1

36. Фрагмент кода, приведенный ниже, использует вид подпрограмм «…»

процедура

функция

вложенные функции

рекурсивная функция

37. Чтобы начать набор текста функции или подпрограммы на языке VBA, необходимо выполнить команду …

Debug/CompileVBAProject

Insert/Procedure;

Insert/Module

38. Установите последовательность этапов процесса разработки программного обеспечения:

1 тестирование

2 постановка задачи

3 подготовка к выполнению

4 отладка

5 выполнение

6 программирование

7 алгоритмизация

39. Установите правильную последовательность основных процессов жизненного цикла программного обеспечения:

1 развитие

2 реализация

3 спецификация требований

4 проектирование

5 определение требований

6 сопровождение

7 тестирование

40. Установите правильный порядок этапов математического моделирования процесса:

1 поиск математического описания

2 определение целей моделирования

3 анализ результата

4 проведение исследования

41. Установите правильный порядок этапов программирования при использовании V-модели:

1 реализация

2 концепция

3 проектирование архитектуры

4 тестирование и проверка системы

5 модульное тестирование и интеграция

6 детальное проектирование

7 введение в эксплуатацию и поддержка

42. Согласно стандарту ISO/IEC 12207 структура жизненного цикла программного обеспечения делится на три группы процессов: …

составные, действующие и вспомогательные

основные, дополнительные и остальные

вспомогательные, основные и дополнительные

основные, вспомогательные и организационные

43. Чаще всего интерпретируемые языки программирования используются для …

программирования баз данных

программирования графических и видеоредакторов

веб-программирования

программирования корпоративных систем

программирования систем реального времени

логического программирования

44. Языки программирования, требующие явного последовательного описания алгоритма решения задачи, операторы которых объединяются в группы, отделенные от данных, – это … языки

процедурно-ориентированные

проблемно -ориентированные

объектно-ориентированные

45. Установите соответствие аспектов моделирования и свойств объекта, отражаемых в модели:

A. Внешний вид

B. Структура

C. Поведение

D. набор чувственно воспринимаемых признаков объекта

E. перечень элементов, составляющих объект, и описание отношений (взаимосвязей) между ними

F. изменение характеристик объекта, изменяемых с течением времени

46. Установите соответствие моделей жизненного цикла программного обеспечения (ПО) и их описания:

A. Каскадная модель

B. Поэтапная модель

C. Спиральная модель

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

E. модель, в которой разработка ПО ведется итерациями с циклами обратной связи между этапами

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

47. AddItem в языке программирования VBA для приложения Microsoft – это …

метод для работы с командными кнопками

метод для добавления строки в элемент управления «список»

свойство элемента управления «текстовое окно»

метод работы с объектом Workbook

48. VBA имеет несколько числовых типов данных – это …

Long

Float

Integer

Currency

Boolean

Double

Real

Single

String

49. В записи на языке программирования VBA, приведенной ниже, переменные X и Y имеют тип данных …Dim X, Y, Z As Integer

Boolean

Variant

Integer

String

Char

50. В программе на VBA алгебраическое выражение (13b+53c+d):(7a+4) записывается следующим образом: …

13*b+53*c+d / 7*a+4

(13*b+53*c+d)/(7*a+4)

(13b+53c+d)/(7a+4)

(13*b+53*c+d):(7*a+4)

(13b+53c+d):7a+4

51. В ряду ключевых слов VBA, обозначающих начало цикла, – …

For

Case

Loop

Const

While

Next

Do

Select

52. После выполнения программы на VBA (см. ниже) при первоначальном значении а = 10, a = -10 значение переменной b равно …

53. Присвоить переменной Txt_1 значение из текстового поля на языке программирования VBA можно с помощью записи: …

Txt_1.TextBox1

Txt_1.Text = Text

Txt_1 = TextBox1.Text

Txt_1 = TextBox1.Caption

Txt_1 TextBox1.Text

Начиная с первых версий VBA, файлы обрабатывались с помощью оператора Open и других файловых операторов и функций. Эти механизмы со временем будут вытеснены объектной моделью FSO (File System Object), но они полностью поддерживаются в версии 5.0.

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

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

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

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

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

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

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

Для работы с папками и дисками:

Функция Dir возвращает значение типа String, представляющее имя файла, каталога или папки, которое удовлетворяет указанному шаблону имени файла, набору атрибутов файла или метке тома на диске.

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

Здесь путь (Необязательный) — строковое выражение, указывающее имя файла; может содержать имя каталога или папки и диска. Если путь не найден, возвращается пустая строка («»). Атрибуты (Необязательный) — константа или числовое выражение, описывающее атрибуты файла. Если этот аргумент опущен, возвращаются все файлы, имена которых удовлетворяют аргументу путь.

Функция Dir поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

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

Функция Dir возвращает первое имя файла, имя которого удовлетворяет аргументу путь. Для получения остальных файлов, имена которых удовлетворяют указанному пути, следует повторно вызвать функцию Dir без аргументов. Если файлов, имена которых удовлетворяют указанному пути, не осталось, возвращается пустая строка («»). При следующем после возврата пустой строки вызове функции необходимо указать аргумент путь; в противном случае возникает ошибка. Изменить значение аргумента путь можно в любой момент, не дожидаясь, пока закончатся файлы, имена которых удовлетворяют текущему пути. Рекурсивный вызов функции Dir запрещен. Вызов функции Dir с атрибутом vbDirectory не приводит к последовательному возврату подкаталогов.

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

Пример: ‘ Возвращает список каталогов на диске C:.

MyPath = "c:"	' Указывает путь.
MyName = Dir(MyPath, vbDirectory)	' Возвращает первый элемент.
Do While MyName <> ""	' Начинает цикл.
' Игнорирует текущий каталог и каталог предыдущего уровня.
If MyName <> "." And MyName <> ".." Then
' является ли MyName каталогом.
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
Debug.Print MyName	' Выводит элемент если это каталог
End If	.
End If
MyName = Dir	' Возвращает следующий элемент.
Loop

Инструкция ChDir — Изменяет текущий каталог или папку.

ChDir путь

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

Инструкция ChDir изменяет текущий каталог, но не изменяет стандартный диск. Например, если стандартным является диск C, то после выполнения следующей инструкции стандартным каталогом станет каталог на диске D, но стандартным диском останется диск C:

ChDir «D:TMP»

Функция CurDir — Возвращает значение типа Variant (String), представляющее текущий путь.

CurDir[(диск)]

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

Инструкция MkDir — Создает новый каталог или папку.

MkDir путь

Обязательный аргумент путь является строковым выражением, определяющим создаваемый каталог или папку. Аргумент путь может содержать имя диска. Если диск не указан, инструкция MkDir создает новый каталог или папку на текущем диске.

Инструкция RmDir — Удаляет существующий каталог или папку.

RmDir путь

Обязательный аргумент путь является строковым выражением, определяющим каталог или папку, которую следует удалить. Аргумент путь может содержать имя диска. Если диск не указан, инструкция RmDir удаляет каталог или папку с текущего диска.

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

Инструкция ChDrive — Изменяет текущий диск.

ChDrive диск

Обязательный аргумент диск является строковым выражением, указывающим существующий диск. Если этот аргумент задается пустой строкой («»), текущий диск не изменится. Если диск является строкой, состоящей из нескольких символов, инструкция ChDrive использует только первый символ.

Для работы со свойствами файлов:

Функция FileDateTime — Возвращает значение типа Variant (Date), содержащее дату и время создания или последнего изменения файла.

FileDateTime(путь)

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

Функция FileLen — Возвращает значение типа Long, содержащее размер файла в байтах.

FileLen(путь)

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

Если в момент вызова функции FileLen указанный файл открыт, возвращается размер этого файла до его открытия. Для определения размера открытого файла следует использовать функцию LOF.

Функция GetAttr — возвращает значение типа Integer, содержащее атрибуты файла, каталога или папки.

GetAttr(путь)

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

Значение, возвращаемое функцией GetAttr, являются суммой следующих значений:

vbNormal 0 Обычный.

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

vbSystem 4 Системный.

vbDirectory 16 Каталог или папка.

vbArchive 32 Файл был изменен после последнего резервирования.

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

Result = GetAttr(FName) And vbArchive

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

Инструкция SetAttr — задает атрибуты файла.

SetAttr pathname, attributes

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

attributes (Обязательный) — константа или числовое выражение, задающее атрибуты файла.

Ниже приведены допустимые значения аргумента attributes:

vbNormal 0 Обычный (по умолчанию).

vbReadOnly 1 Только чтение.

vbHidden 2 Скрытый.

VbSystem 4 Системный.

vbArchive 32 Файл был изменен после последнего резервирования.

При попытке изменения атрибутов открытого файла возникает ошибка выполнения.

Для манипулирования файлами:

Инструкция FileCopy — Копирует файл.

FileCopy source, destination

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

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

При попытке скопировать открытый файл с помощью инструкции FileCopy возникает ошибка.

Инструкция Name — Изменяет имя файла, каталога или папки.

Name староеИмя As новоеИмя

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

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

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

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

Инструкция Kill — удаляет файлы с диска.

Kill путь

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

Инструкция Kill поддерживает использование подстановочных знаков для нескольких символов (*) и для одиночного символа (?) для указания нескольких файлов.

При попытке удалить открытый файл с помощью инструкции Kill возникает ошибка. Для удаления каталогов следует использовать инструкцию RmDir.

Для управления файлами:

Инструкция Open — разрешает выполнение с файлом операций ввода/вывода.

Open путь For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина]

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

режим (Обязательный) — ключевое слово, указывающее режим файла: Append, Binary, Input, Output или Random. По умолчанию, файл открывается в режиме Random.

доступ (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом: Read, Write или Read Write.

блокировка (Необязательный) — ключевое слово, указывающее операции, разрешенные с открытым файлом другим процессам: Shared, Lock Read, Lock Write и Lock Read Write.

номерФайла (Обязательный) — допустимый номер файла в интервале от 1 до 511 включительно. Для определения следующего свободного номера файла следует использовать функцию FreeFile.

длина (Необязательный) — Число, меньшее либо равное 32 767 (байт). Для файлов, открытых в режиме Random, это значение является длиной записи. Для файлов с последовательным доступом это значение является числом буферизуемых символов.

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

Если аргумент путь описывает несуществующий файл, такой файл будет создан при открытии в режиме Append, Binary, Output или Random.

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

Если аргумент режим имеет значение Binary, предложение Len игнорируется.

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

Функция FreeFile — Возвращает значение типа Integer, представляющее следующий номер файла, доступный для использования с инструкцией Open.

FreeFile[(диапазонНомеров)]

Необязательный аргумент диапазонНомеров является выражением типа Variant, указывающим диапазон, из которого возвращается следующий свободный номер файла. Значение 0 (используется по умолчанию) задает возвращение номера файла из диапазона 1 — 255 включительно. Значение 1 задает возвращение номера файла из диапазона 256 — 511.

Функцию FreeFile используют для возвращения незанятого номера файла.

Инструкция Close — завершает операции ввода/вывода с файлом, открытым с помощью инструкции Open.

Close [списокНомеровФайлов]

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

[[#]номерФайла] [, [#]номерФайла] . . .

Если аргумент списокНомеровФайлов опущен, закрываются все активные файлы, открытые с помощью инструкции Open.

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

Инструкция Close разрывает связь между файлом и соответствовавшим ему номером файла.

Инструкция Reset — Закрывает все файлы, открытые с помощью инструкции Open.

Reset

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

Для позиционирования в открытом файле:

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

Seek(номерФайла)

Обязательный аргумент номерФайла является выражением типа Integer, содержащим допустимый номер файла.

Функция Seek возвращает значение в интервале от 1 до 2 147 483 647 (т.е. 2^31 — 1) включительно.

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

Random Номер записи, которая будет считана или записана следующей.

Binary, Output, Append, Input Номер байта, с которого начинается выполнение следующей операции ввода/вывода. Первому байту файла соответствует 1, второму 2 и т.п.

Функция EOF — Возвращает значение типа Integer содержащее логическое значение True при достижении конца файла.

EOF(номерФайла)

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

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

Функция EOF возвращает значение False до тех пор, пока не будет достигнут конец файла. При использовании с файлами, открытыми в режиме Random или Binary, функция EOF возвращает значение True, если последней выполненной инструкции Get не удалось считать целую запись; в противном случае возвращается значение False.

Для файлов, открытых для доступа в режиме Binary, попытка чтения файла с помощью функции Input до возвращения функцией EOF значения True приводит к ошибке. При чтении двоичных файлов с помощью функции Input следует вместо функции EOF использовать функции LOF и Loc или использовать с функцией EOF инструкцию Get.

Ввод/вывод в файлы различных типов доступа.

Последовательный доступ к файлам:

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

Файлы, открытые для последовательного доступа, допускают следующие операции:

ввод символов в файл (Input);

вывод символов из файла (Output);

добавление символов в файл (Append).

Чтобы открыть файл для последовательного доступа, следует использовать оператор Open:

Open pathname For [Input | Output | Append] As filenum [Len = Buffersize]

Когда последовательный файл открывается для ввода (Input), файл должен существовать, иначе возникнет ошибка. Однако при попытке открыть несуществующий файл для операций вывода (Output) или добавления (Append) оператор Open сначала создает файл, а затем открывает его. Номер файла filenum является обязательным и может быть получен с помощью функции FreeFile. Необязательный параметр Len задает число символов в буфере для операций копирования данных из файла в приложение. Чем больше буфер, тем реже производятся обращения к диску. После открытия файла для операций Input, Output или Append его надо закрыть с помощью оператора Close, прежде чем открывать для операции другого типа.

Для редактирования файла сначала надо прочитать его содержимое в программные переменные, затем изменить переменные и записать их содержимое обратно в файл. Чтобы получить содержимое текстового файла, следует открыть его для операции последовательного ввода (Input). Затем используют оператор Line Input #, Input () или Input #, чтобы скопировать файл в программные переменные. Существуют операторы и функции, которые для последовательных файлов читают и записывают один символ или одну строку за одну операцию. Следующий фрагмент читает файл строка за строкой:

Dim Lines As String, NextLine As String

Do Until EOF (FileNum)

Line Input # FileNum, NextLine

Lines = Lines + NextLine + Chr(13) + Chr(10)

Loop

Оператор Line Input # распознает последовательность символов CR/LF, но не включает их в переменную. О сохранении этих символов должен позаботиться программист.

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

Input # FileNum, name, street, city, zip, country

Можно использовать функцию Input () для копирования любого числа символов из файла в переменную при условии, что они могут поместиться в этой переменной:

Lines = Input (n, FileNum)

Чтобы скопировать целый файл в переменную, следует использовать функцию InputB. Так как она возвращает строку в коде ANSI, для преобразования ее в строку UNICODE надо применять функцию StrConv:

Lines = StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)

Для записи строк в файл следует открыть его для последовательного вывода (Output) или добавления (Append), а затем использовать оператор Print #, например:

Print #FileNum, Text

Существует также оператор Write #, который записывает список чисел и/или строковых выражений в файл. Он автоматически отделяет каждое выражение запятой и заключает строковые выражения в кавычки:

AnyString = «AnyChars» : AnyNum = 12345

Write #FileNim, AnyString, AnyNum

Результат будет выглядеть так:

«AnyChars»,12345

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

Sub пример12()
Dim first() As String, s() As String
Dim n As Integer, i As Integer, k As Integer
Dim fn As Integer, x As String
i = 1: k = 0
fn = FreeFile
Open "D:input.txt" For Input As fn
Do While Not EOF(fn)
ReDim Preserve s(1 To i)
ReDim Preserve first(1 To i)
Line Input #fn, s(i)
first(i) = Left(s(i), 1)
i = i + 1
Loop
Close #fn
i = i - 1
fn = FreeFile
Open "D:output.txt" For Output As fn
For n = 1 To i
If n <> i Then
For k = n + 1 To i
If first(k) = first(n) Then
Print #fn, s(n), s(k)
End If
Next k
End If
Next n
Close #fn
End Sub

Произвольный доступ к файлам:

Байты в файлах произвольного доступа формируют записи, каждая из которых содержит одно или более полей. Запись с одним полем соответствует любому стандартному типу. Запись с несколькими полями соответствует определяемому пользователем типу. Например, тип Worker, определяемый ниже, создает 19 байтные записи, которые состоят из трех полей:

Type Worker

LastName As String * 10

Title As String * 7

Rank As String * 2

End Type

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

‘Переменная записей

Public Employee As Worker

‘Текущая запись

Public Position As Long

‘Номер последней записи в файле

Public LastRecord As Long

Открыть файл для производного доступа можно с помощью следующего синтаксиса оператора Open:

Open pathname [ For Random] As filenumber Len = reclength

Так как типом доступа по умолчанию является произвольный (random), ключевые слова For Random не обязательны.

Выражение Len = reclength задает размер каждой записи в байтах. Заметим, что каждая строковая переменная в VBA хранится в формате Unicode, и надо задать длину этой строки. Если reclength меньше, чем действительная длина записываемой в файл записи, генерируется ошибка. Если reclength больше действительной длины записи, то запись сохраняется, но дисковое пространство при этом будет расходоваться нерационально.

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

Dim FileNum As Integer, RecLength As Long, Employee As Person

‘ Вычисляем длину каждой записи.

RecLength = LenB (Employee)

‘ Получаем следующий доступный номер файла.

FileNum = FreeFile

‘ Открываем новый файл оператором Open.

Open «MYFILR.FIL» For Random As FileNum Len = RecLength

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

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

Get FileNum, Position, Employee

В этой строке Employee содержит номер, который оператор Open использовал для открытия файла; Position содержит номер записи, которая копируется; переменная Employee, объявленная с определенным пользователем типом Worker, получает содержимое записи.

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

Put # FileNum, Position, Employee

Этот код заменит запись с номером, заданным переменной Position, данными из переменной Employee.

Чтобы добавить новые записи в конец файла, открытого для произвольного доступа, следует использовать оператор Put, показанный в предыдущем фрагменте кода. Для этого надо установить значение переменной , Position равным на единицу больше номера последней записи в файле. Например, чтобы добавить новую запись в файл, содержащий пять записей, следует установить переменную Position равной 6.

Следующий оператор добавляет запись в конец файла:

LastRecord = LastRecord + 1

Put #FileNum, LastRecord, Employee

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

Чтобы удалить запись в файле произвольного доступа, следует:

1. Создать новый файл.

2. Скопировать все необходимые из исходного файла в этот новый файл.

3. Закрыть исходный файл и с помощью оператора Kill удалить его.

4. С помощью оператора Name переименовать новый файл, дав ему имя исходного файла.

Доступ к двоичным файлам:

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

Чтобы открыть файл для двоичного доступа, используют следующий синтаксис Open:

Open pathname For Binary As filename

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

Понравилась статья? Поделить с друзьями:
  • Закрыть предприятие с нулевыми отчетами пошаговая инструкция
  • Закрыть ооо самостоятельно пошаговая инструкция 2022
  • Закрыть ооо на усн самостоятельно пошаговая инструкция 2020
  • Закрыть ооо без деятельности самостоятельно пошаговая инструкция
  • Закрыть обособленное подразделение в 2022 году пошаговая инструкция