В этом уроке
рассмотрим работу с папками и
текстовыми файлами: создание,
изменение, чтение,запись,
удаление,
копирование,перемещение,
переименование и т.д.
Функции
и инструкции, которые бутут
рассмотрены в процессе урока: CurDir,ChDrive,
ChDir, MkDir,
RmDir, Dir, Kill,FreeFile,
Open, Close,Reset,
Print #, Write #, Input
#, Put,Seek, Loc,
LOF,EOF, Get,
FileLen,FileDateTime, FileAttr,GetAttr,
SetAttr, FileCopy,Name.
Функция CurDir
Возвращает
значение типа Variant (
String),представляющее
текущий путь.
CurDir[(диск)]
Необязательный аргумент дискявляется
строковым
выражением,указывающим
существующий диск.Если диск
не указан или аргумент диск
является пустой
строкой(""), функция CurDirвозвращает
путь к текущему диску.
Function FileUtils_GetCurDir(Optional
strDrive As String = "") As String
'© NSA Programmer, 2001.
http://www.msaccess.ru ~ E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~
ICQ: 7349882
'----------------------------------------------------------
' Функция возвращает
текущую папку на диске
strDrive.
' Если strDrive не передано -
текущую папку на текущем
диске
'----------------------------------------------------------
On Error Resume Next
FileUtils_GetCurDir = CurDir(strDrive)
End Function |
Инструкция
ChDrive
Изменяет
текущий диск.
ChDrive
диск
Обязательный аргумент диск
является строковым выражением,
указывающим существующий диск.
Если этот аргумент задается
пустой строкой (""),
текущий диск не изменится. Если
диск является
строкой, состоящей из
нескольких символов,
инструкция ChDrive
использует только первый
символ.
Function FileUtils_GetCurDrive()
As String
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция возвращает
текущий диск.
'----------------------------------------------------------
On Error Resume Next
FileUtils_GetCurDrive = Left(CurDir(), 1) &
":\"
End Function |
Function FileUtils_ChDrive(Optional
strDrive As String = "") As String
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция изменяет и
возвращает текущий диск.
'----------------------------------------------------------
On Error Resume Next
Call ChDrive(strDrive)
FileUtils_ChDrive = FileUtils_GetCurDrive
End Function |
Инструкция
ChDir
Изменяет
текущий каталог или папку.
ChDir
путь
Обязательный аргумент путь
является строковым выражением,
определяющим какой каталог
(или папка) станет стандартным.
Аргумент путь
может содержать имя диска. Если
диск не указан, инструкция ChDir
изменяет стандартный каталог
или папку на текущем диске.
Инструкция ChDir
изменяет стандартный каталог,
но не изменяет стандартный
диск. Например, если
стандартным является диск C, то
после выполнения следующей
инструкции стандартным
каталогом станет каталог на
диске D, однако стандартным
диском останется диск C:
ChDir
"D:\TMP"
Function FileUtils_ChDir(strPath
As String, Optional blChDrive As Boolean = False)
As String
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция изменяет и
возвращает текущую папку.
' Если blChDrive = TRUE то
изменяется также и текущий
диск.
'----------------------------------------------------------
On Error Resume Next
Err.Clear
Call ChDir(strPath)
If blChDrive = True And Err.Number = 0 Then
Call ChDrive(strPath)
End If
FileUtils_ChDir = FileUtils_GetCurDir
End Function |
Инструкция
MkDir
Создает новый
каталог или папку.
MkDirпуть
Обязательный аргумент путь
является строковым выражением,
определяющим создаваемый
каталог или папку. Аргумент путь
может содержать имя диска. Если
диск не указан, инструкция MkDir
создает новый каталог или
папку на текущем диске.
Function FileUtils_MkDir(strPath
As String, Optional blChDir As Boolean = False,
Optional blChDrive As Boolean = False) As Boolean
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция создает папку и
возвращает TRUE\FALSE в
зависимости от успеха
операции.
' Если blChDir = TRUE то созданная
папка становится текущей
папкой.
' Если blChDrive = TRUE то
изменяется также и текущий
диск.
'----------------------------------------------------------
On Error Resume Next
Err.Clear
Call MkDir(strPath)
If blChDir = True And Err.Number = 0 Then
Call FileUtils_ChDir(strPath,
blChDrive)
End If
FileUtils_MkDir = (Err.Number = 0)
End Function |
Инструкция
Kill
Удаляет файлы
с диска.
Kill
путь
Обязательный аргумент путь
является строковым выражением,
указывающим имена одного или
нескольких файлов, подлежащих
удалению. Аргумент путь
может содержать имя каталога
или папки и диска.
Инструкция Kill
поддерживает использование
подстановочных знаков для
нескольких символов (*) и для
одиночного символа (?) для
указания нескольких файлов.
При попытке удалить открытый
файл с помощью инструкции Kill
возникает ошибка. Для удаления
каталогов следует
использовать инструкцию RmDir.
Function FileUtils_Kill(strPath
As String) As Boolean
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция удаляет файл(ы)
strPath и возвращает TRUE\FALSE в
зависимости от успеха
операции.
' FALSE будет означать что
файл открыт. Если файла нет
- ф-я вернет TRUE.
' В strPath допустимо
использование
подстановочных знаков
"*" и "?"
'----------------------------------------------------------
On Error Resume Next
Err.Clear
Call Kill(strPath)
FileUtils_Kill = (Err.Number = 0 Or Err.Number =
53)
End Function |
Инструкция
RmDir
Удаляет
существующий каталог или
папку.
RmDirпуть
Обязательный аргумент путь
является строковым выражением,
определяющим каталог или
папку, которую следует удалить.
Аргумент путь
может содержать имя диска. Если
диск не указан, инструкция RmDir
удаляет каталог или папку с
текущего диска.
При попытке удалить с помощью
инструкции RmDir
каталог (или папку), который
содержит файлы, возникает
ошибка. Для предварительного
удаления всех файлов из
каталога или папки следует
использовать инструкцию Kill.
Function FileUtils_RmDir(strPath
As String, Optional blKillFiles As Boolean =
False, Optional blRmSubDir As Boolean = False,
Optional blKillFilesInSubDir As Boolean = False)
As Integer
'©
NSA Programmer, 2001. http://www.msaccess.ru ~ E-
mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция удаляет папку
strPath
' и возвращает: -1 - операция
прошла успешно. Все что
нужно - удалено.
' 0 - ни одного удаления не
было произведено.
' 1 - удаление было
произведено не полностью.
(Например какие-то файлы а
папке были открыты и т.п.)
' Если blKillFiles = TRUE - папка
strPath удаляется вместе с
файлами.
' Если blRmSubDir = TRUE - папка strPath
удаляется вместе с
вложенными папками.
' если при этом blKillFilesInSubDir =
TRUE - вложенные папки
удаляются вместе с
файлами.
'Примеры вызова функции:
' Удаление ТОЛЬКО папки
если она не пуста:
FileUtils_RmDir("C:\MyDir")
' Удаление папки вместе с
находящимися в ней
файлами:
FileUtils_RmDir("C:\MyDir", True)
' Удаление папки вместе с
находящимися в ней файлами
и папками:
FileUtils_RmDir("C:\MyDir", True, True)
' Удаление папки вместе с
находящимися в ней файлами
и папками с находящимися в
них файлами:
FileUtils_RmDir("C:\MyDir", True, True,
True)
'----------------------------------------------------------
On Error Resume Next
Dim blResultKillFiles As Boolean
Dim blResultRmSubDir As Integer
Dim MyName As String
If Right(strPath, 1) <> "\" Then
strPath = strPath & "\"
blResultKillFiles = True
blResultRmSubDir = True
'Если нужно
удалять вложенные папки...
If blRmSubDir = True Then
MyName = Dir(strPath, vbDirectory) '
Возвращает первый элемент.
Do While MyName <> "" '
Начинает цикл.
' Игнорирует
текущий каталог и каталог
предыдущего уровня.
If MyName <> "." And MyName
<> ".." Then
' Использует
поразрядное сравнение для
проверки того,
' является ли MyName
каталогом.
If (GetAttr(strPath & MyName) And
vbDirectory) = vbDirectory Then
'Рекурсивный
вызов для вложенной папки
blResultRmSubDir = FileUtils_RmDir(strPath
& MyName & "\",
blKillFilesInSubDir, blRmSubDir,
blKillFilesInSubDir)
End If
End If
Err.Clear 'Сбрасываем код
ошибки
MyName = Dir '
Возвращает следующий
элемент.
'Поскольку в
цикле могло произойти
удаление папки - Dir без
'аргументов может вернуть
ошибку. Если это случилось
'необходимо заново
инициализивать Dir
If Err.Number <> 0 Then MyName =
Dir(strPath, vbDirectory)
Loop
End If
'Если нужно
удалять файлы
If blKillFiles = True Then
blResultKillFiles = FileUtils_Kill(strPath
& "*.*")
End If
Err.Clear
Call RmDir(strPath)
If (Err.Number = 0 Or Err.Number = 76) Then
FileUtils_RmDir = -1
If (blKillFiles = True And blResultKillFiles =
False) Or (blRmSubDir = True And blResultRmSubDir
<> -1) Then
FileUtils_RmDir = 1
End If
Else
FileUtils_RmDir = 0
End If
End Function |
Функция Dir
Возвращает
значение типа String,
представляющее имя файла,
каталога или папки, которое
удовлетворяет указанному
шаблону имени файла, набору
атрибутов файла или метке тома
на диске.
Dir[(путь[,
атрибуты])]
путь -
Необязательный. Строковое
выражение, указывающее имя
файла; может содержать имя
каталога или папки и диска.
Если путь не
найден, возвращается пустая
строка ("").
атрибуты -
Необязательный. Константа или
числовое выражение,
описывающее атрибуты файла.
Если этот аргумент опущен,
возвращаются все файлы, имена
которых удовлетворяют
аргументу путь.
Ниже приведены допустимые
значения аргумента атрибуты:
Константа |
Значение |
Описание |
vbNormal |
0 |
Обычный |
vbHidden |
2 |
Скрытый |
vbSystem |
4 |
Системный |
vbVolume |
8 |
Метка тома; если
указана, все остальные
атрибуты игнорируются |
vbDirectory |
16 |
Каталог или папка. |
Данные
константы определяются в языке
Visual Basic для
приложений. Это означает, что
их имена можно использовать в
любом месте кода вместо
фактических значений.
Функция Dir
поддерживает использование
подстановочных знаков для
нескольких символов (*) и для
одиночного символа (?) для
указания нескольких файлов.
При первом вызове функции Dir
необходимо указать путь,
в противном случае возникает
ошибка. Если указаны атрибуты
файла, наличие аргумента путь
является обязательным. Функция
Dir возвращает первое
имя файла, имя которого
удовлетворяет аргументу путь.
Для получения остальных
файлов, имена которых
удовлетворяют указанному пути,
следует повторно вызвать
функцию Dir без
аргументов. Если файлов, имена
которых удовлетворяют
указанному пути, не осталось,
возвращается пустая строка
(""). При следующем после
возврата пустой строки вызове
функции необходимо указать
аргумент путь; в
противном случае возникает
ошибка. Изменить значение
аргумента путь
можно в любой момент, не
дожидаясь, пока закончатся
файлы, имена которых
удовлетворяют текущему пути.
Рекурсивный вызов функции Dir
запрещен. Вызов функции Dir
с атрибутом vbDirectory не приводит
к последовательному возврату
подкаталогов. Поскольку имена
файлов возвращаются в
произвольном порядке, их можно
сохранить в массиве, а затем
отсортировать этот массив.
Функция FileLen
Возвращает
значение типа Long,
содержащее размер файла в
байтах.
FileLen(путь)
Обязательный аргумент путь
является строковым выражением,
определяющим файл. Аргумент
путь может содержать имя
каталога или папки и диска.
Если в момент вызова функции FileLen
указанный файл открыт,
возвращается размер этого
файла до его открытия. Для
определения размера открытого
файла следует использовать
функцию LOF.
Function FileUtils_GetFileLen(strPath
As String) As Long
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция возвращает
размер файла strPath в байтах
'----------------------------------------------------------
On Error Resume Next
FileUtils_GetFileLen = FileLen(strPath)
End Function |
Напишем
функцию, возвращающую размер
файлов в указанной папке,
включая вложенные.
Function FileUtils_GetDirLen(strPath
As String, Optional blCheckSubDir As Boolean =
False) As Long
'©
NSA Programmer, 2001. http://www.msaccess.ru ~
E-mail:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
~ ICQ: 7349882
'----------------------------------------------------------
' Функция возвращает
размер файлов в папке strPath
в байтах
' Если blCheckSubDir = TRUE -
считается размер файлов во
вложенных папках
'----------------------------------------------------------
On Error Resume Next
Dim MyName As String ' Имя файла
или папкм
Dim lngLen As Long ' Размер
файла в текущей папке
Dim lngLenSub As Long 'Размер
файлов во вложенной папке
Dim arDirs() As String 'Массив
"обработанных" имен
вложенных папок
Dim lngBound As Long 'Размерность
массива имен
Dim blPresent As Boolean 'Признак
"обработанности"
папки
Dim i As Long 'Счетцик
цикла
'Добавляем к
переданному пути слэш
(если его нет)
If Right(strPath, 1) <> "\" Then
strPath = strPath & "\"
Err.Clear 'Сбрасываем
ошибку
MyName = Dir(strPath) '
Возвращает первый элемент.
Do While MyName <> "" And
Err.Number = 0 ' Начинает
цикл.
' Игнорирует
текущий каталог и каталог
предыдущего уровня.
If MyName <> "." And MyName
<> ".." Then
' Использует
поразрядное сравнение для
проверки того,
' является ли MyName
каталогом.
If (GetAttr(strPath & MyName) And
vbDirectory) <> vbDirectory Then
'Получаем размер
файла
lngLen = lngLen + FileUtils_GetFileLen(strPath
& MyName)
End If
End If
Err.Clear 'Сбрасываем
ошибку
MyName = Dir '
Возвращает следующий
элемент.
Loop
If blCheckSubDir = True Then
Err.Clear 'Сбрасываем
ошибку
lngBound = 0 'Сбрасываем
счетчик размерности
массива
MyName = Dir(strPath, vbDirectory) '
Возвращает первый элемент.
Do While MyName <> "" And
Err.Number = 0 ' Начинает
цикл.
' Игнорирует
текущий каталог и каталог
предыдущего уровня.
If MyName <> "." And MyName
<> ".." Then
blPresent = False 'Сбрасываем
признак
'Цикл по массиву
For i = 1 To lngBound
'если текущая
папка (файл) уже есть в
массиве...
If arDirs(i) = MyName Then
'Устанавливаем
признак и выходим из цикла
blPresent = True
Exit For
End If
Next i
'Если признак не
установлен (папка еще не
обрабатывалась)...
If blPresent = False Then
'Инкримируем
размерность массива...
lngBound = lngBound + 1
'... и сам массив...
ReDim Preserve arDirs(lngBound)
'... и заносим в
него текущую папку (файл).
arDirs(lngBound) = MyName
' Использует
поразрядное сравнение для
проверки того,
' является ли MyName
каталогом.
If (GetAttr(strPath & MyName) And
vbDirectory) = vbDirectory Then
If blCheckSubDir = True Then
'Рекурсивный
вызов для вложенной папки
lngLenSub = lngLenSub +
FileUtils_GetDirLen(strPath & MyName &
"\", blCheckSubDir)
'Заново
"инициализируем"
инструкцию Dir.
'Весь этот наворот с
массивом имен был нужен
именно
'для этого. Инструкции Dir
глубоко безразличен наш
'рекурсивный вызов,
поэтому и пришлось
извращаться
'таким способом :-(((
MyName = Dir(strPath, vbDirectory)
End If
End If
End If
End If
Err.Clear 'Сбрасываем
ошибку
MyName = Dir '
Возвращает следующий
элемент.
Loop
End If
FileUtils_GetDirLen = lngLen + lngLenSub
End Function |
Функция FreeFile
Возвращает
значение типа Integer,
представляющее следующий
номер файла, доступный для
использования с инструкцией Open.
FreeFile[(
диапазонНомеров)]
Необязательный аргумент диапазонНомеров
является выражением типа Variant,
указывающим диапазон, из
которого возвращается
следующий свободный номер
файла. Значение 0 (используется
по умолчанию) задает
возвращение номера файла из
диапазона 1 - 255 включительно.
Значение 1 задает возвращение
номера файла из диапазона 256 -
511.
Функцию FreeFile
используют для возвращения
незанятого номера файла.
Инструкция
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
необходимо закрыть файл, чтобы
получить возможность открыть
его еще раз под другим номером.
При работе с
большим количеством данных
часто бывает удобно записывать
данные в файл или считывать из
файла. Инструкция Open
позволяет напрямую создать
файл и получить к нему доступ.
Инструкция Open
обеспечивает три типа доступа
к файлам:
·Последовательный доступ
(режимы Input, Output
и Append режимы), обычно
используемый для записи
текстовых файлов, например
протоколов ошибок или отчетов.
·Произвольный доступ
(режим Random),
используемый при
необходимости считать и
записать данные в файл без его
закрытия. Файлы произвольного
доступа содержат данные в виде
записей, которые упрощают и
ускоряют поиск нужных
сведений.
·Двоичный доступ
(режим Binary),
используется, когда требуется
считать или записать байт в
любую позицию в файле, например
при сохранении или отображении
точечных изображений.
Инструкцию Open не
следует использовать для
доступа к собственным типам
файлов приложений. Например, не
следует использовать Open
для доступа к документу Word,
к электронной таблице Microsoft
Excel или к базе данных Microsoft
Access, поскольку это вызовет
потерю целостности и порчу
файла.
В следующей таблице
показываются инструкции,
обычно используемые для записи
данных в файлы и для чтения
данных из файлов.
Тип
доступа |
Запись
данных |
Чтение
данных |
Последовательный |
Print #, Write # |
Input # |
Произвольный |
Put |
Get |
Двоичный |
Put |
Get |
Инструкция
Close
Завершает
операции ввода/вывода с файлом,
открытым с помощью инструкции Open.
Close
[ списокНомеровФайлов]
Необязательный аргумент списокНомеровФайлов
может представлять один или
несколько номеров файлов. При
этом используется следующий
синтаксис, где номерФайла
представляет любой допустимый
номер файла:
[[#]
номерФайла] [, [#]номерФайла]
. . .
Если аргумент списокНомеровФайлов
опущен, закрываются все
активные файлы, открытые с
помощью инструкции Open.
При закрытии файла, открытого в
режиме Output или Append,
в него добавляется содержимое
последнего буфера вывода. Все
буферы, связанные с закрытым
файлом, освобождаются.
Инструкция Close
разрывает связь между файлом и
соответствовавшим ему номером
файла.
Инструкция
Reset
Закрывает все
файлы, открытые с помощью
инструкции Open.
Reset
Инструкция Reset
закрывает все активные файлы,
открытые с помощью инструкции Open,
и записывает содержимое всех
буферов файлов на диск.
Инструкция
Print #
Записывает
отформатированные данные в
файл с последовательным
доступом.
Print#номерФайла,
[списокВывода]
номерФайла -
Обязательный. Любой допустимый
номер файла.
списокВывода -
Необязательный. Выражение или
список выражений, которые
следует напечатать.
Ниже приведены допустимые
значения аргумента списокВывода:
[{Spc
(n) | Tab[(n)]}]
[ выражение] [позиция]
Spc(n) -
Используется для вставки
пробелов в файл; здесь n
число пробелов, которые
следует вставить.
Tab (n) -
Устанавливает курсор в столбец
с указанным номером; здесь n
номер столбца. Tab без
аргумента устанавливает
курсор в начало следующей зоны
печати.
выражение -
Числовые выражения или
строковые выражения, которые
следует напечатать.
позиция -
Указывает позицию, в которой
следует печатать следующий
символ. Для установки курсора
сразу после последнего
напечатанного символа
используйте точку с запятой.
Для установки курсора в
столбец с указанным номером
используйте Tab(n).
Для установки курсора в начало
следующей зоны печати
используйте Tab без
аргумента. Если аргумент позиция
опущен, следующий символ
печатается на следующей
строке.
Данные, записанные с помощью
инструкции Print #,
обычно считываются из файла с
помощью инструкций Line Input #
или Input.
Если аргумент списокВывода
опущен, после аргумента номерФайла
идет только разделитель
списка, в файл печатается
пустая строка. Для разделения
выражений можно использовать
пробелы или точки с запятой,
которые в данной ситуации
полностью эквивалентны. При
выводе логических данных (тип Boolean)
в файл записываются слова True
или False. Ключевые
слова True и False
не переводятся, вне
зависимости от национальной
настройки.
При выводе данных типа Date
используется текущий краткий
системный формат даты. Если
компонент, описывающий дату
или время, отсутствует или
равен нулю, в файл записывается
только имеющийся в наличии
компонент.
Если списокВывода
имеет значение Empty, в
файл ничего не записывается.
Однако если списокВывода
имеет значение Null, в
файл записывается ключевое
слово Null.
Данные типа Error
записываются в файл как ErrorкодОшибки.
Ключевое слово Error не
переводятся, вне зависимости
от национальной настройки.
Инструкция Print #
записывает в файл данные,
отформатированные с учетом
национальной настройки. Это
означает, в частности, что
используется соответствующий
разделитель целой и дробной
части числа.
Поскольку инструкция Print #
записывает в файл
отформатированные данные,
необходимо использовать
разделители данных,
обеспечивающие правильную
печать. Если Tab без
аргумента используется для
перемещения позиции вывода в
начало следующей зоны печати, Print
# также записывает пробелы
между полями печати в файле.
Для записи в файл данных,
который в будущем планируется
читать с помощью инструкции Input
#, следует вместо
инструкции Print #
использовать инструкцию Write
#. Использование
инструкции Write #
гарантирует, что записанные
данные будут корректно
разделены, что позволит
прочитать их с помощью
инструкции Input #. Кроме
того, файлы, записанные с
помощью инструкции Write #,
могут быть корректно прочитаны
при наличии любых национальных
настроек.
Инструкция
Write #
Записывает
неформатированные данные в
файл с последовательным
доступом.
Write#номерФайла,
[списокВывода]
номерФайла -
Обязательный. Любой допустимый
номер файла.
списокВывода -
Необязательный. Одно или
несколько разделяемых
запятыми числовых выражений
или строковых выражений,
которые следует записать в
файл.
Данные, записанные с помощью
инструкции Write #,
обычно считываются из файла с
помощью инструкции Input #.
Если аргумент списокВывода
опущен, а после аргумента номерФайла
идет только разделитель
списка, в файл будет напечатана
пустая строка. Для разделения
выражений можно использовать
пробелы, точки с запятой или
запятые, которые в данной
ситуации полностью
эквивалентны.
Ниже приведены правила,
которые используются при
записи данных в файл с помощью
инструкции Write #.
Записанные данные могут быть
корректно прочитаны с помощью
инструкции Input # при
наличии любой национальной
настройки:
·В качестве десятичного
разделителя при записи
числовых данных всегда
используется точка.
·При выводе логических данных
(тип Boolean) в файл записываются
ключевые слова #TRUE#
или #FALSE#. Ключевые
слова True и False
не переводятся.
·При выводе в файл данных типа Date
используется универсальный
формат даты. Если компонент,
соответствующий дате или
времени, отсутствует или равен
нулю, в файл записывается
только имеющийся в наличии
компонент.
·Если аргумент списокВывода
имеет значение Empty,
в файл ничего не записывается.
·Если списокВывода
имеет значение Null, в
файл записывается #NULL#.
·Данные типа Error
записываются в файл как #ERROR
кодОшибки#.
Ключевое слово Error не
переводится.
В отличие от инструкции Print
#, инструкция Write #
вставляет запятые между
элементами и заключает строки
в кавычки по мере записи их в
файл. Разработчику не
требуется включать
разделители в список явным
образом. Write #
вставляет символ новой строки,
т.е. комбинацию символов
возврата каретки и перевода
строки (Chr(13)
+ Chr(10)), после записи в файл
последнего символа,
включенного в списокВывода.
Инструкция
Input #
Читает данные
из открытого
последовательного файла и
присваивает их переменным.
Input#
номерФайла, списокПеременных
номерФайла -
Обязательный. Любой допустимый
номер файла.
списокПеременных
- Разделяемый запятыми список
переменных, которым следует
присвоить значения, считанные
из файла. Нельзя использовать
массивы или объектные
переменные. Однако допускается
использование переменных,
описывающих элементы массива
или определяемого
пользователем типа.
Данные, считываемые с помощью
инструкции Input #,
обычно записываются в файл с
помощью инструкции Write #.
Эта инструкция применима
только к файлам, открытым в
режиме Input или Binary.
После считывания стандартные
строки и числовые данные
присваиваются переменным без
изменения. В следующей таблице
показано, как обрабатываются
остальные данные:
Данные |
Значение,
присваиваемое переменной |
Запятая-разделительили
пустая строка |
Empty |
#NULL# |
Null |
#TRUE# или #FALSE# |
True или False |
#yyyy-mm-dd hh:mm:ss# |
Дата и/или время,
являющиеся результатом
выражения. |
#ERROR кодОшибки# |
кодОшибки
(переменная типа Variant,
помеченная как ошибка). |
Прямые
кавычки (" ") внутри
считываемых данных
игнорируются. Элементы данных
в файле должны располагаться в
том же порядке, что и
переменные в спискеПеременных,
и иметь соответствующие
переменным типы данных. Если
переменная является числовой,
а элемент данных нечисловым,
переменной присваивается
нулевое значение. При
достижении конца файла во
время считывания элемента
данных ввод прекращается и
возникает ошибка.
Чтобы иметь возможность
корректно считывать данные из
файла в переменные с помощью
инструкции Input #,
следует всегда использовать
инструкцию Write # (а не Print
#) для записи данных в
файлы. Использование
инструкции Write #
гарантирует правильность
размещения разделителей между
отдельными элементами данных.
Инструкция
Put
Записывает
содержимое переменной в файл
на диске.
Put
[#]номерФайла,
[ номерЗаписи], имяПеременной
номерФайла -
Обязательный. Любой допустимый
номер файла.
номерЗаписи -
Необязательный. Номер записи
(режим Random) или номер
байта (режим Binary), с
которого следует начать
запись.
имяПеременной -
Обязательный. Имя переменной,
содержащей данные, которые
следует записать в файл.
Данные, записанные с помощью
инструкции Put, обычно
считываются из файла с помощью
инструкции Get. Первой
записи (или байту) файла
соответствует номер 1, второй 2
и т.п. Если аргумент номерЗаписи
опущен, записывается запись
(или байт), на которую указатель
был установлен после
выполнения последней
инструкции Get или Put
переведен с помощью функции Seek.
Наличие запятых-разделителей
является обязательным,
например:
Put#4,,FileBuffer
Для файлов, открытых в режиме Random,
применимы следующие правила:
·Даже если длина данных,
подлежащих записи, меньше
длины записи, указанной в
предложении Len
инструкции Open,
инструкция Put
начинает запись каждой
следующей записи с начала этой
записи. Пространство между
концом одной записи и началом
следующей записи заполняется
текущим содержимым буфера
файла. Поскольку объем данных,
используемых для заполнения,
не может быть определен с
достаточной степенью
уверенности, рекомендуется,
чтобы длина записи совпадала с
длиной читаемых данных. Если
длина данных, подлежащих
записи, больше длины записи,
указанной в предложении Len
инструкции Open,
возникает ошибка.
·При записи строки переменной
длины инструкция Put
сначала записывает 2-байтовый
дескриптор, содержащий длину
строки, а затем содержимое этой
переменной. Таким образом,
длина записи, указанная в
предложении Len
инструкции Open, должна
по крайней мере на 2 байта
превышать фактическую длину
этой строки.
·При записи переменной Variant
числового типа инструкция Put
сначала записывает 2 байта,
указывающие подтип ( VarType)
типа Variant, а затем
содержимое этой переменной.
Например, при чтении
переменной Variant
подтипа VarType 3,
инструкция Put
записывает 6 байт: 2 байта,
указывающие тип переменной Variant
как VarType 3 (Long), и 4
байта, содержащие значение
типа Long. Длина записи,
указанная в предложении Len
инструкции Open, должна
по крайней мере на 2 байта
превышать фактическое число
байт, необходимое для
размещения этой переменной.
С помощью инструкции Put
можно записать массив типа Variant
на диск, однако, нельзя
записать скаляр типа Variant,
содержащий массив. Кроме того,
инструкцию Put нельзя
использовать для записи
объектов на диск.
·При записи переменной Variant
подтипа VarType 8 (String) инструкция
Put сначала записывает
2 байта, указывающие VarType,
потом 2 байта, указывающие
длину строки, а затем
содержимое строки. Длина
записи, указанная в
предложении Len
инструкции Open, должна
крайней мере на 4 байта
превышать фактическую длину
этой строки.
·При записи динамического
массива инструкция Put
сначала записывает дескриптор,
длина которого равняется (2 + 8 * числоРазмерностей)
байт. Длина записи, указанная в
предложении Len инструкции
Open, должна быть больше
либо равна сумме всех байтов,
необходимых для размещения
массива данных и дескриптора
массива. Например, для
размещения описанного ниже
массива требуется 118 байт:
Dim MyArray(1 To
5,1 To 10) As Integer
·118 байт распределяются
следующим образом: 18 байт для
дескриптора (2 + 8 * 2), и 100 байт
для данных (5 * 10 * 2).
·При записи массива
фиксированной длины
инструкция Put
записывает только данные.
Дескриптор не записывается.
·При записи переменной любого
другого типа (кроме строки
переменной длины и переменной
типа Variant), инструкция Put
записывает только данные.
Длина записи, указанная в
предложении Len
инструкции Open, должна
быть больше либо равна длине
записываемых данных.
·Инструкция Put
записывает элементы
определяемых пользователем
типов так, будто это отдельные
переменные, за исключением
того, что пространство между
элементами не заполняется
текущим содержимым буфера
файла. На диске динамический
массив типа, определенного
пользователем (записанный с
помощью инструкции Put)
предваряется дескриптором,
длина которого равняется (2 + 8 * числоРазмерностей)
байт. Длина записи, указанная в
предложении Len
инструкции Open, должна
быть больше либо равна сумме
всех байтов, необходимых для
размещения отдельных
элементов, в том числе,
массивов и их дескрипторов.
Для файлов, открытых в режиме Binary,
применимы все перечисленные
выше правила, за исключением
следующих:
·Предложение Len
инструкции Open
игнорируется. Инструкция Put
записывает все переменные на
диск непрерывно, т.е. без
заполнения пространства между
записями текущим содержимым
буфера файла.
·При записи любых массивов,
кроме являющихся элементами
типов, определяемых
пользователем, инструкция Put
записывает только данные.
Дескриптор не записывается.
·При записи строк переменной
длины, не являющихся
элементами типов, определяемых
пользователем, 2-байтовый
дескриптор не записывается.
Число записываемых байт
равняется числу символов,
содержащихся в строке.
Например, следующие инструкции
запишут 10 байт в файл, которому
соответствует номер 1:
VarString$ =
String$(10," ")
Put #1,,VarString$
|