Закрыть файл открытый с помощью инструкции 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:\a\b».
  • Если путь и файл передаются отдельно, то имя файла не должно содержать пути.
  • Все параметры являются обязательными и не могут быть пустыми. Последнее обстоятельство не проверяется.

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

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


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


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


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


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

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


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


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

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


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


….

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

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


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


….

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


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


….

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

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

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


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


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


Содержание

  • 1. Общие понятия о файлах
  • 2. Особенности работы с файлами в Python
  • 3. Типы файлов в Python. Текстовые файлы. Бинарные файлы
  • 4. Открытие файла. Функция open(). Общая форма
  • 5. Параметр mode. Режимы открытия файлов
  • 6. Закрытие файла. Функция close()
  • 7. Функции open(), close(). Открытие/закрытие файла для разных типов файлов
    • 7.1. Открытие в текстовом формате
      • 7.1.1. Чтение из файла, режимы ‘r’, ‘rt’. Пример
      • 7.1.2. Запись в файл, режимы ‘w’, ‘wt’
    • 7.2. Открытие в бинарном (двоичном) режиме
      • 7.2.1. Режимы ‘wb’, ‘w+b’ – запись информации в файлы
      • 7.2.2. Режимы ‘rb’, ‘r+b’ – чтение информации из файлов
  • 8. Особенности открытия файла для обновления в двоичном формате. Режимы ‘w+b’, ‘r+b’
  • 9. Пример, который демонстрирует разные случаи политики буферизации (значение buffering)
  • 10. Как вывести размер буфера, который установлен по умолчанию? Пример
  • Связанные темы

Поиск на других ресурсах:

1. Общие понятия о файлах

В программах на Python существует возможность работы с файлами, которые относятся к базовым встроенным типам объектов. Файл – это именованная область постоянной памяти. Управлением работой файла занимается операционная система. Для каждого файла создается объект, который обеспечивает связь с файлом. Файл может быть размещен в любом месте компьютера (жесткий диск, флешь-носитель и т.п.).

Любой файл носит имя, которое может быть полным или сокращенным. В случае полного имени (полный путь к файлу) в имя файла включается:

  • носитель (ресурс) на котором размещен файл (например диск C:, D:);
  • перечень каталогов (папок) от верхнего до нижнего уровня разделенных символом ‘\’ (бэкслэш). Пример полного имени: «C:\ABC\myfile.txt».

Если используется сокращенное имя, то включается относительный путь, а именно:

  • перечень каталогов (папок) относительно текущего каталога, в котором размещается исходный файл модуля Python с расширением *.py. Пример сокращенного имени «TEXT\myfile.txt».

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

 

2. Особенности работы с файлами в Python

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

  • файлы в Python не принадлежат ни к числам, ни к последовательностям, ни к отображениям;
  • данные, что формируются из файла, отображаются в виде строки. Поэтому, для представления данных в других типах объектов, нужно реализовывать их конвертирование. Это касается как чтения из файла, так и записи данных в файл. Если осуществляется запись в файл, то методам обработки нужно передавать уже сформированные строки;
  • необязательно вызывать метод close(). Этот метод будет вызван автоматически после окончания программы. Однако, вызов метода close() для закрытия файла есть рекомендованным (смотрите п. 6);
  • файлы обеспечивают буферизацию ввода/вывода. По умолчанию, вывод в файлы осуществляется с помощью промежуточных буферов (специально отведенных участков памяти заданного размера). Если выполняется операция записи, то данные сперва попадают в буфер, а затем позже могут быть записаны в файл (функции flush(), close()). По желанию можно отключить режим буферизации. Более подробно о механизме буферизации описывается в п. 4;
  • файлы позволяют выполнять позиционирование, при котором изменяется позиция чтения/записи в файле.

 

3. Типы файлов в Python. Текстовые файлы. Бинарные файлы

В языке программирования Python, как и в других языках программирования, выделяют два типа файлов:

  • текстовый тип. Это файлы, которые представленные в виде строк типа str. В языке Python для таких строк происходит автоматическое кодирование/декодирование символов Unicode а также соответствующим образом обрабатывается символ конца строки;
  • бинарный (двійковий) тип. Это файлы представленные в виде строк типа bytes. Такие строки при записи в файл передаются без дополнительной обработки. Так же при чтении из файла, строки не обрабатываются.

 



4. Открытие файла. Функция open(). Общая форма

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

Открытие файла осуществляется с помощью функции open(). Эта функция возвращает соответствующий файловый объект. Если файл не может быть открыт, то вызывается исключение OSError. Это исключение генерируется, если происходят ошибки в операциях ввода/вывода такие как «файл не найден» или другие.

В соответствии с документацией Python функция open() имеет следующую общую форму

open(file, mode = 'r', buffering = -1, encoding = None, 
     errors = None, closefd = True, opener = None)

здесь

  • file – это строка или целочисленное значение. Если указывается строка, то file определяет путь к файлу (полное или сокращенное имя файла). Например: ‘C:\1.txt’, ‘file.txt’. Если указывается целочисленное значение, то это означает, что file есть файловый дескриптор. Параметр file есть обязательным в функции open(). Все другие параметры являются необязательными;
  • mode – необязательная строка, которая задает режим открытия файла. По умолчанию mode = ‘r’, это означает что файл открывается в текстовом режиме для чтения. Значение mode формируется в соответствии со значениями, которые описываются в пункте 4. Для текстового режима необязательно задавать значение ‘t’. Если файл открывается в бинарном (двоичном) режиме, то к значению mode обязательно добавляется ‘b’;
  • buffering – необязательное целое число, которое используется для установки политики буферизации. Понятие «буферизация» означает, что при чтении (записи) информации из файла (в файл) эта информация предварительно записывается в специальный участок памяти – буфер (buffer). Таким образом, информация дублируется в буфере заданного размера. Правильно подобранное значение размера буфера позволяет ускорить выполнение программы, которая интенсивно использует работу с файлами. Значение buffering может быть одним из четырех возможных:
    • buffering = 0. В этом случае буферизация отключена. Значение 0 разрешается устанавливать только для двоичных файлов (режим с обозначением ‘b’).
    • buffering = 1 – строчная буферизация, которая есть доступна только для текстовых файлов. Буфером служит строка переменного размера.
    • buffering>1 – буферизация, включенная как для текстовых так и для двоичных файлов. Здесь значение bufferin задает фиксированный размер буфера в байтах.
    • buffering не задан – это есть случай по умолчанию, когда buffering = -1. Если не указать значения buffering, то политика буферизации работает следующим образом:
      • 1. Для двоичных файлов формируется фиксированный размер буфера, значение которого получается из величины io.DEFAULT_BUFFER_SIZE.
      • 2. Для так называемых «интерактивных» текстовых файлов используется буферизация строки (buffering = 1). Для других текстовых файлов используется такая же буферизация как для двоичных файлов описанная выше;
  • encoding – имя кодировки, используемое для кодирования или декодирования файла. Этот параметр используется только для текстовых файлов. Если encoding не задан, то используется кодировка по умолчанию которая зависит от платформы;
  • errors – необязательный строчный параметр, определяющий как должны обрабатываться ошибки кодирования и декодирования. Этот параметр используется только для текстовых файлов. Параметр errors может принимать одно из значений: ‘strict’, ‘ignore’, ‘replace’, ‘surrogateescape’, ‘xmlcharrefreplace’, ‘backslashreplace’, ‘namereplace’. Более подробно об обработке ошибок кодирования можно найти в документации Python;
  • newline – необязательный параметр, который контролирует работу универсального режима новой строки. Этот параметр используется только в текстовом режиме. Параметр newline может принимать одно из следующих значений: None, ‘\n’, ‘\r’ или ‘\r\n’. Более подробно об использовании символов новой строки в разных режимах можно найти в документации Python;
  • closefd – необязательный параметр, который имеет смысл в случае если вместо имени файла задан дескриптор. Если задано имя файла, то значение closefd обязательно должно быть равно True (значение по умолчанию), иначе возникнет ошибка. В случае, если задан дескриптор файла рассматриваются 2 возможные ситуации:
    • closefd = False. В этом случае базовый дескриптор будет оставаться открытым после закрытия файла.
    • closefd = True. После закрытия файла базовый дескриптор файла закрывается.
  • opener – этот необязательный параметр задает функцию пользователя, которая может быть использована для открытия файла. В этом случае пользователь должен задать собственную функцию открытия файла. По умолчанию значение opener = None.

 

5. Параметр mode. Режимы открытия файлов

Ниже перечислены все возможные символы, определяющие разные режимы открытия файлов, которые могут быть указаны в параметре mode функции open(). Символы могут образовывать последовательности, например ‘rb’, ‘rt’, ‘wb’, ‘wt’, ‘r+b’, ‘w+b’.

Режимы открытия файла в зависимости от значения mode:

  • ‘r’ – файл открывается для чтения (режим по умолчанию);
  • ‘w’ – файл открывается для записи. Если файл с таким именем уже существует, то предыдущее содержимое файла уничтожается;
  • ‘х’ – файл открывается для эксклюзивного создания. Если такой файл уже существует, то возникает сбой;
  • ‘а’ – открывает файл для записи. Если такой файл уже существует, то открывает файл для добавления (информация записывается от конца файла);
  • ‘b’ – двоичный тип файла. Это значение может быть в сочетании со значениями ‘r’, ‘w’, ‘х’, ‘а’;
  • ‘t’ – текстовый тип файла. Это значение может быть в сочетании с ‘r’, ‘w’, ‘х’, ‘а’. Текстовый тип файла устанавливается по умолчанию;
  • ‘+’ – открыть файл на диске для обновления (чтения/записи);
  • ‘U’ – режим, который определяет представление символа новой строки: в конвенции Unix это ‘\n’, в Windows – ‘\r\n’, в Macintosh – ‘\r’.

 

6. Закрытие файла. Функция close()

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

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

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

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

  • открыть файл;
  • осуществить операции с файлом (чтение/запись);
  • если файл больше не нужен, то закрыть этот файл функцией close().

Пример.

Если файл был открыт следующим образом:

f = open('myfile.txt', 'r')

то после окончания использования этого файла его нужно закрыть функцией close()

f.close()

которая разрывает связь с внешним файлом.

Если после вызова функции close() попробовать вызвать методы работы с файлом (чтение или запись), то будет сгенерирована ошибка ValueError.

 

7. Функции open(), close(). Открытие/закрытие файла для разных типов файлов

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

  • открытие файла функцией open();
  • обработку файлов – чтение/запись файлов;
  • закрытие файла функцией close().

 

7.1. Открытие в текстовом формате
7.1.1. Чтение из файла, режимы ‘r’, ‘rt’. Пример
# Открыть файл для чтения в текстовом режиме
# Способ 1. Открыть файл 'myfile1.txt' - сокращенный путь к файлу
f1 = open('myfile1.txt','r')

# Способ 2. Открыть файл, который размещен по пути c:\2\myfile2.txt
#           'rt' - чтение файла в текстовом режиме
f2 = open('c:\\2\\myfile2.txt','rt')

# После открытия можно работать с содержимым файла
# ...

# Например, прочитать некоторую строку из файла myfile1.txt
s1 = f1.readline()
print(s1)

s2 = f2.readline() # Прочитать строку из файла myfile2.txt
print(s2)

# Закрыть файлы (в языке Python необязательно)
f1.close()
f2.close()

 

7.1.2. Запись в файл, режимы ‘w’, ‘wt’

Чтобы открыть файл для записи в текстовом формате нужно использовать обозначение режимов ‘w’ или ‘wt’.

# Открыть текстовый файл для записи,
# можно также задавать 'wt'
f3 = open('myfile3.txt', 'wt')

# Запись в файл
# ...

# Записать в файл несколько строк
f3.write("using static System.Console;\n")
f3.write("class Program\n")
f3.write("{ }\n")

# Закрыть файл
f3.close()

 

7.2. Открытие в бинарном (двоичном) режиме
7.2.1. Режимы ‘wb’, ‘w+b’ – запись информации в файлы
# Двоичный режим
# Запись списка в файл

# Заданный список
A = [1, True, 2.88]

# Открыть файл для записи
f1 = open('myfile1.bin', 'wb')
f2 = open('myfile2.bin', 'w+b')

# Для удобной работы в двоичном формате
# целесообразно использовать возможности модуля pickle
import pickle

# метод dump() - записывает объект в файл
pickle.dump(A,f1)
pickle.dump(A,f2)

# Закрыть файлы, с которыми связаны объекты f1, f2
f1.close()
f2.close()

  

7.2.2. Режимы ‘rb’, ‘r+b’ – чтение информации из файлов
# Двоичный режим
# Чтение списка из файла

# Для удобной работы в двоичном формате
# целесообразно использовать возможности модуля pickle
import pickle

# Прочитать список из файла
f1 = open('myfile1.bin', 'rb')
f2 = open('myfile2.bin', 'r+b')

# метод load() - загружает данные из файла
B1 = pickle.load(f1)
B2 = pickle.load(f2)

print("B1 = ", B1)
print("B2 = ", B2)

f1.close()
f2.close()

Результат выполнения программы

B1 = [1, True, 2.88]
B2 = [1, True, 2.88]

 

8. Особенности открытия файла для обновления в двоичном формате. Режимы ‘w+b’, ‘r+b’

Если в функции open() параметр mode содержит символ ‘+’, то файл открывается для обновления. Здесь возможны два варианта параметра mode:

  • mode = ‘w+b’. В этом случае файл обрежется до 0 байт;
  • mode = ‘r+b’. В этом случае файл открывается без обрезания с сохранением предыдущей информации. Указатель чтения/записи устанавливается в конец файла.

 

9. Пример, который демонстрирует разные случаи политики буферизации (значение buffering)
# Чтение файла. Демонстрация буферизации.
# Разные значения параметра buffering

# --------------------------------------
# 1. buffering = 0
# 1.1. Для текстовых файлов - ошибка, исключение с сообщением
# "саn't have unbuffered text I/O"
# f1 = open("myfile1.txt", buffering = 0) - только в двоичном режиме

# 1.2. Для бинарных файлов
f1 = open("myfile1.bin", mode='rb', buffering=0)
buffer = f1.read() # считать информацию
print("Read from myfile1.bin. buffer = ", buffer)   # вывести ее
f1.close()

# -------------------------------------
# 2. buffering = 1
# 2.1. Для текстовых файлов
f1 = open("myfile1.txt", buffering=1)
s = f1.readline() # Считать строку
print("Read from myfile1.txt. s = ", s)
f1.close()

# 2.2. Для бинарных файлов
f1 = open("myfile1.bin", mode='rb', buffering=1)
buffer = f1.read()
print("Read from myfile1.bin. buffer = ", buffer)
f1.close()

# --------------------------------------
# 3. buffering = 128 - размер буфера 128 байт
f1 = open("myfile1.txt", buffering = 128)
f2 = open("myfile1.bin", 'rb', buffering = 128)
s = f1.readline() # прочитать строку
print("Read from myfile1.txt. s = ", s)
buffer = f2.readline()
print("Read from myfile1.bin. buffer = ", buffer)

f1.close()
f2.close()

Результат выполнения программы

Read from myfile1.bin. buffer =   b'\x80\x03]q\x00(K\x01\x88G@\x07\n=p\xa3\xd7\ne.'
Read from myfile1.txt. s = #include <iostream.h>

Read from myfile1.bin. buffer =   b'\x80\x03]q\x00(K\x01\x88G@\x07\n=p\xa3\xd7\ne.'
Read from myfile1.txt. s = #include <iostream.h>

Read from myfile1.bin. buffer = b'\x80\x03]q\x00(K\x01\x88G@\x07\n'

 

10. Как вывести размер буфера, который установлен по умолчанию? Пример

Размер буфера в байтах по умолчанию установлен в значении io.DEFAULT_BUFFER_SIZE.

import io
print(io.DEFAULT_BUFFER_SIZE)

Результат работы программы

Buffer size = 8192

 


Связанные темы

  • Примеры работы с текстовыми файлами

 


2.14. Файлы VBA
2.14.1. Типы файлов в VBA
В VBA допустима работа с тремя типами текстовых файлов.
Файл последователь- ного доступа
Последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно
Файл произвольного доступа
Состоит из записей фиксированной длины и раз- мер записи указывается при его открытии. Это позволяет локализовать любую запись в файле по ее номеру
Бинарный файл
Является частным случаем файла произвольного доступа. Размер записи в бинарном файле счи- тается равным 1 байту

108
2.14.2. Открытие и закрытие файла
Обсудим инструкции, связанные с открытием файла для операций ввода/вывода, а также с закрытием файла по завершению работы с ним.
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 (байт).
Close
Завершает операции ввода/вывода с файлом, открытым с помощью инст- рукции Open.
Формат инструкции:
Close [СписокНомеровФайлов]
Аргумент СписокНомеровФайлов может представлять один или несколько номеров файлов. При этом используется следующий синтаксис, где но- мерФайла представляет любой допустимый номер файла: [[#] номерФай-
ла] [, [#] номерФайла] …
Если СписокНомеровФайлов не указан, инструкция Close закрывает все активные файлы, открытые инструкцией Open.
Reset
Закрывает все активные файлы, открытые с помощью инструкции Open, и записывает содержимое всех буферов файлов на диск, открытых с помо- щью инструкции Open.
Формат инструкции:
Reset
FreeFile
Функция возвращает доступный номер, который может использоваться в инструкции Open.

109
Приведем пример инструкции, открывающей для записи бинарный файл
Первый из рабочей папки, и затем инструкции, закрывающей этот бинар- ный файл.
Open «Первый» For Binary Access Write As #1
Close #1
2.14.3. Ввод данных в файл последовательного доступа
Print
Записывает форматированные данные в файл последовательного доступа.
Формат инструкции:
Print # НомерФайла, [СписокВывода]
Номерфайла – любой допустимый файловый номер
СписокВывода – выражение или список выражений, записываемое в файл. В аргументе СписокВывода разделителем списка выводимых выражений является «;» (данные выводятся подряд) или «,» (данные выводятся по зонам).
Write #
Записывает неформатированные данные в файл последовательного дос- тупа. В отличие от инструкции Print, инструкция write вставляет запятые между элементами и заключает строки в кавычки по мере записи их в файл.
Формат инструкции:
Write #НомерФайла, [СписокВывода]
НомерФайла – любой допустимый файловый номер
СписокВывода – выражение или список выражений, записываемых в файл Данные, записанные с помощью инструкции Write, обычно счи- тываются из файла с помощью инструкции Input.
Приведем две процедуры, использующие инструкции Print и Write для соз- дания файлов последовательного доступа.
Sub ПримерИспользованияPrint()
Open «Новый» For Output As #1

Print #1, «Тест»
‘ Печатает текст в файл ‘
Print #1,
‘ Печатает пустую строку в файл ‘
Print #1, «Зона 1»; Tab; «Зона 2»; Spc(3); «3 пробела»
‘ Печатает в двух зонах печати

110

Close #1
End Sub
Sub ПримерИспользованияWrite()
Open «ЕщеПример» For Output As #1
Write #1, «Пример»; «использования»
Write #1, «инструкции»
Write #1, «Write» x = 1
Write #1, «Число»;
Close #1
End Sub
Результатом описанных выше инструкций будет файл со следующим со- держимым:
«Пример»,»использования» «инструкции»,»Write» «Число»,1
Следует обратить внимание на автоматическое размещение в файле разделителей – запятых и то, что строковая информация берется в кавыч- ки. В процедуре ПримерИспользованияWrite вторая инструкция Write спе- циально заканчивается знаком «;». Это обеспечивает вывод данных треть- ей инструкцией Write в ту же строку файла, в которую выводила вторая инструкция.
2.14.4. Вывод данных из файла последовательного доступа
Input #
Считывает данные из открытого файла последовательного доступа и при- сваивает их переменным. Данные, считываемые с помощью инструкции
Input #, обычно записываются в файл с помощью инструкции Write #.
Формат инструкции:
Input # НомерФайла, СписокПеременных
Номерфайла – любой допустимый файловый номер
СписокПеременных – список разделённых запятыми переменных, которым следует присвоить значения, считанные из файла
Line Input #
Считывает одну строку из открытого файла последовательного доступа и присваивает ее переменной типа String. Данные, считываемые с помощью инструкции Line input #, как правило, записываются в файл с помощью ин- струкции Print #.
Формат инструкции:
Line Input #НомерФайла, ИмяПеременной

111
Синтаксис инструкции Line Input # содержит следующие элементы:
НомерФайла – номер файла
ИмяПеременной – имя переменной типа Variant или String
Функция Input
Возвращает значение типа String, содержащее символы из файла, откры- того в режиме Input или Binary. Функция input считывает данные, записы- ваемые в файл с помощью инструкции Print # или Put.
Формат инструкции:
Input (Число, [#] НомерФайла)
Число задает число возвращаемых символов. Если аргумент Число равен
1, то производится посимвольное считывание данных.
Функция EOF
Функция возвращает значение True при достижении конца файла.
Формат инструкции:
EOF (НомерФайла)
При последовательном считывании информации из файла часто исполь- зуется следующий цикл:
Do While Not EOF(l) Loop или While Not EOF (I) Wend.
Пример
Ниже приведены две процедуры:
ЗаписьПоследоватФайла и
ЧтениеПоследоватФайла,– в которых создаётся, а затем читается файл
Ведомость, размещаемый в папке E:\VBA_INTERNET. При чтении файла, созданного процедурой ЗаписьПоследоватФайла, отличие действия инст- рукций Input и Line Input в процедуре ЧтениеПоследоватФайла проявятся при чтении записи, созданной инструкцией Write #1, «Алексеев С.С.»,
206709, «Информатика», «Отлично». Инструкция Line Input #1, Ввод счи- тает ее целиком в переменную Ввод, в то время, как инструкция Input #1,
Ввод считывает записи последовательно, и для чтения всей строки дол- жен выполниться четыре раза.
Sub ЗаписьПоследоватФайла()
Open «e:\VBA_INTERNET\Ведомость» For Output As #1
Print #1, «Алексеев С.С.», 206709
Print #1, «Информатика»
Write #1, «Отлично»
Write #1, «Алексеев С.С.», 206709, «Информатика», «Отлично»
Close #1
End Sub
Sub ЧтениеПоследоватФайла()
Dim Ввод
Open «e:\VBA_INTERNET\Ведомость» For Input As #1
Input #1, Ввод: MsgBox Ввод
Input #1, Ввод: MsgBox Ввод

112
Input #1, Ввод: MsgBox Ввод
Line Input #1, Ввод: MsgBox Ввод
Close #1
End Sub
Ниже приведены диалоговые окна, выводимые инструкцией MsgBox.
2.14.5. Работа с файлом произвольного доступа
Приведем инструкции ввода/вывода информации при работе с фай- лом произвольного доступа, а также инструкции определения длины фай- ла и текущей позиции указателя в файле.
Put
Записывает содержимое переменной в файл произвольного доступа.
Формат инструкции:
Put [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
НомерФайла – номер файла
НомерЗаписи – номер записи (режим Random) или номер байта
(режим Binary), с которого следует начать запись. Если аргумент
НомерЗаписи опущен, то записывается на то место, где был уста- новлен указатель после выполнения последней инструкции Get или Put, либо куда он переведен с помощью функции Seek
ИмяПеременной – имя переменной, содержащей данные, которые следует записать в файл
Get
Читает данные из открытого файла произвольного доступа в переменную.
Формат инструкции:
Get [#] НомерФайла, [НомерЗаписи] , ИмяПеременной
НомерФайла – номер файла
НомерЗаписи – номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует на- чать чтение

113
Имяпеременной – имя переменной, в которую следует поместить считанные данные
Seek
Функция возвращает значение типа Long, определяющее текущее поло- жение указателя чтения/записи внутри файла, открытого с помощью инст- рукции Open.
Формат функции:
Seek (НомерФайла)
LOF
Функция возвращает значение типа Long, представляющее размер файла в байтах, открытого с помощью инструкции Оpen . Для определения раз- мера закрытого файла следует использовать функции FileLen.
Формат функции:
LOF (НомерФайла)
FileLen
Функция возвращает значение типа Long, содержащее размер файла в байтах.
Формат функции:
FileLen (Путь )
Как видно из приведенного в предыдущем разделе примера для счи- тывания информации при помощи инструкции Input #, файл последова- тельного доступа иногда удобно задавать как последовательность запи- сей, причем каждая из записей формируется из группы полей. В файле последовательного доступа существует только одна внутренняя структура, образованная разделителями: запятыми или специальными символами, обозначающими переход на новую строку.
В противоположность файлам последовательного доступа, в файлах произвольного доступа запись является встроенным элементом. Файл произвольного доступа – это файл, упорядоченный по номерам записей, что позволяет быстро переместиться на любую запись, минуя предыду- щие.
При создании файла произвольного доступа указывается макси- мальная длина каждой записи. Само собой разумеется, что в любую за- пись можно вводить данные, занимающие не всё место, выделенное для записи, но нельзя ввести данные, требующие больше места, чем допусти- мая длина записи. Лишняя информация будет просто усекаться.
Отметим, что при открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, от- крывается он для ввода или вывода информации. Ввод и вывод информа- ции определяют команды Put и Get.
Приведем пример работы с файлом произвольного доступа Ведо-
мость. Файл создается с помощью процедуры ЗаписьВФайлПД, которая

114
последовательно считывает данные из первого и второго столбца рабоче- го листа и затем вводит их в файл. В этой процедуре число вводимых за- писей фиксировано и равно 3. Процедура СчитываниеИзФайлаПД произ- водит обратное действие – считывает данные из файла и вводит их в ячейки третьего и четвертого столбца рабочего листа.
При работе с файлом произвольного доступа можно определить чис- ло записей, не пересчитывая их. Число записей равно отношению размера файла к длине одной записи. Длина записи устанавливается при создании файла произвольного доступа и определяется типом переменной, при по- мощи которой файл был создан. Размер открытого файла определяется функцией LOF, а еще не открытого – функцией FileLen. В рассматривае- мом случае число записей в файле равно LOF(l) / Len(Студент).
Структура записи Студент определяется на модульном уровне, т.е. перед первой процедурой модуля.
Type Студент
Фамилия As String * 20
Оценка As String * 5
End Type
Sub ЗаписьВФайлПД()
Dim Студент As Студент
Dim i As Integer
Open «Список» For Random As #1 Len = Len(Студент)
For i = 2 To 4
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(1) / Len(Студент) + 1
For i = 2 To n
Get #1, i, Студент
With Студент
Cells(i, 3).Value = .Фамилия
Cells(i, 4).Value = .Оценка
End With

115
Next i
Close #1
End Sub
Ниже приведены таблицы Excel до и после выполнения процедуры Счи-
тываниеИзФайлаПД.
2.15. Создание процедуры
Создание первой процедуры проекта требует выполнения двух по- следовательных шагов:
1. вставка модуля в рабочую книгу;
2. написание процедуры в этом модуле.
Приложение может содержать один или несколько модулей. Имея не- сколько модулей, можно организовать их по назначению, виду и т.п. Соз- дадим процедуру, которая будет выводить на экран окно сообщения. Для создания этой процедуры нужно выполнить следующие действия.
1. Открыть новую рабочую книгу.
Выполнить команду Сервис > Макрос > Редактор Visual Basic. Откроется окно редактора Visual Basic. В левой части окна редактора Visual Basic появится окно проектов Project Explorer. Если окно проектов не появится, надо нажать комбинацию клавиш

.

116 2. Если окно проектов VBAProject (Книга1)не откроется, то открыть его, щелкнув левой кнопкой мыши по значку элемента VBAProject
(Книга1).
3. Щелкнуть правой кнопкой мыши на элементе ЭтаКнига. В появив- шемся контекстном меню выбрать команду Insert > Module. В прило- жение будет добавлен модуль.
+

117
В верхней части окна кода модуля находится инструкция Option
Explicit, которая принуждает явно описывать все переменные с помощью инструкций Dim, Private, Public, ReDim и Static. Если попытаться использо- вать переменную без её объявления, то при компиляции кода будет выда- на ошибка. Эта инструкция в новом модуле появляется только тогда, когда в диалоговом окне Options на вкладке Editor установлен флажок опции
RequireVariableDeclaration. Диалоговое окно Options открывается коман- дой Tools > Options.
4. Выполнить команду Insert > Procedure. Откроется диалоговое окно
Add Procedure.
5. Ввести имя процедуры, например, ПерваяПроцедура. В секции Туре установить переключатель Sub.
6. Щелкнуть на кнопке ОК. В пустой строке находится текстовый курсор, предлагая начать ввод кода процедуры.
7. Нажать клавишу Таb и ввести следующий текст:
MsgBox «Это процедура VBA»
После того как введено MsgBox и нажата клавиша пробела, появится окно с информацией о данной инструкции. Делать отступ текста с помо- щью клавиши Таb не обязательно. Отступ делается для более легкого чтения кода.
7. Нажать клавишу Enter.
Ниже приведена введённая процедура.

118
VBA требует выполнения определенных правил для имен подпро- грамм и функций. Эти правила таковы.
 Первые три символа имени должны быть буквами.
 Имя может содержать буквы, цифры и знаки подчеркивания.
 Имя не может содержать пробелы, точки, запятые, восклицатель- ные знаки (!) и символы @, &, $, #.
 Имя не должно иметь более 255 символов.
2.16. Выполнение процедуры
После создания процедуры её можно сразу выполнить. Для этого су- ществует несколько способов. Можно использовать команду Run
Sub|UserForm (Выполнить подпрограмму|экранную форму) из меню Run
(Выполнить) или щелкнуть на кнопке Run Sub|UserForm стандартной пане- ли инструментов или нажать клавишу F5. Итак, чтобы выполнить процеду- ру, нужно сделать следующее.
1. Щёлкнуть кнопкой Run Sub|UserForm стандартной панели инструмен- тов редактора Visual Basic. Процедура выполнится и отобразит окно сообщения:
2. Щёлкнуть кнопкой ОК. Произойдёт возврат в окно редактора Visual
Basic.
2.17. Сохранение процедуры
Чтобы сохранить новую процедуру, надо сохранить рабочую книгу, где находится эта процедура. Можно сохранить рабочую книгу из редактора
Visual Basic. Для этого нужно:
1. выполнить команду File > Save Книга (Файл > Сохранить книгу). Если рабочая книга еще ни разу не сохранялась, дать ей имя;
2. ввести Первая в качестве имени книги и нажать клавишу Enter.
Рабочая книга, модуль и процедура будут сохранены.
2.18. Запись последовательности действий пользователя
Excel позволяет записывать последовательность действий пользова- теля, а затем преобразовать их в код VBA. Записанный VBA код макроса может служить основой для дальнейших разработок, а также является хо- рошим учебным материалом для изучения VBA. Например, чтобы узнать, как в VBA записать последовательность каких-либо действий, нужно запи- сать макрос, выполняющий эти действия, и затем проанализировать код макроса и при необходимости внести изменения в него.
Пример

119
Создать макрос, используя запись последовательности действий пользователя, для решения следующей задачи.
При работе в Excel необходимо часто вводить на рабочий лист на- именование и “шапку” таблицы, приведённой ниже.
Для этого нужно выполнить следудующие действия:
1. Выделить блок ячеек A1:D1.
2. Объединить ячейки блока.
3. Ввести наименование таблицы (слово

Начиная с первых версий 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. Будучи включено в оператор открытия двоичного файла, оно просто игнорируется, поскольку предполагается, что записи имеют произвольную длину. Отсюда следует, что невозможно организовать доступ к записям в произвольном порядке, а только последовательно, определяя длину каждой записи. В то же время можно непосредственно обращаться к каждому байту в файле.

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