Урок 5. Работа с папками и файлами. Часть 1
Автор 62   
24.10.2001 г.

Урок 5. Работа с папками и файлами.

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

Функции и инструкции, которые бутут рассмотрены в процессе урока: 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$



Просмотров: 18469

  Коментарии (4)
 1 Написал(а) Александра, в 15:05 02.04.2009
Скажите, пожалуйста, а как можно в VBA для Access скопировать файл с известным путем к нему (в виде строковой переменной), переименовать его и поместить в нужную папку (путь к ней тоже имеется)? Очень нужно!Срочно. :upset
 2 Написал(а) я, в 03:12 23.10.2009
а как заменить строку в текстовом файле записного оператором print#? 
скажем открыл файл для добавления (Append), тепрь курсор находиться в конце таблицы, как двигаться к началу? 
найти там строку 111 изаменить её на 121, не переписывая весь файл?
 3 Написал(а) q, в 08:33 25.03.2011
:cry :cry :cry :cry :cry :cry :cry :cry :cry :cry :cry :cry :cry :cry :cry
 4 Написал(а) Костя, в 08:35 25.03.2011
Подскажите пожалуйста, как в vba в файле открытый бинарным путем, перенести строку на следующую?

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code