Скачиваний:
11
Добавлен:
30.09.2018
Размер:
36.09 Кб
Скачать

3 3. Лекция: Работа с устройствами, папками, файлами: версия для печати и PDA

Рассматривается работа с объектами файловой системы. Особый интерес представляет классический вопрос записи данных в файл, чтение данных из файла, поддерживаемый практической работой 19. Элементы управления DriveListBox, DirListBox и FileListBox Для работы с деревом файлов используйте элементы управления DriveListBox, DirListBox и FileListBox панели элементов управления (рис. 3.1).

   

Рис. 3.1.  DriveListBox, DirListBox и FileListBox  

  Имеется возможность после старта проекта выбрать требуемый объект, например файл каталога некоторого дискового устройства для дальнейшей работы с ним. Рассмотрим кратко некоторые параметры этих элементов управления:

  DriveListBox (рис. 3.1 вверху слева). Имена дисковых устройств (свойство Name) в соответствии с соглашением по коду начинаются с drv; важным свойством является Drive, оно доступно только во время выполнения проекта и определяет выбранное пользователем дисковое устройство. Из имеющихся событий представляет интерес Change, происходящее при выборе пользователем нового дискового устройства,

DirListBox (рис. 3.1 в середине слева). При выборе нового дискового устройства в поле элемента управления DirListBox выводится список соответствующих каталогов. Имена каталогов в соответствии с соглашением по коду начинаются с dir. Свойство Path, доступное во время выполнения, задает/возвращает путь к каталогу, выбранному пользователем из списка. Списки обновляются в процедуре события Change,

FileListBox (рис. 3.1 внизу слева). В списках файлов перечисляются файлы текущего каталога, откуда их можно выбрать. Имеется около 50 свойств. Свойство Path доступно только во время выполнения, его можно задать и возвратить. Свойства Hidden, Normal, ReadOnly, System, Archive дают возможность вывести в список только требуемые файлы. Имеется около 20 событий. Часто в процедуре CommandК_Click () выполняются действия, связанные со значениями Path и FileName списка файлов.

  Чтобы обеспечить совместное функционирование элементов управления DriveListBox, DirListBox и FileListBox после размещения их на форме, нужно создать синхронизирующие их работу процедуры:

  Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Для вывода содержимого каталога после его маркировки и нажатия клавиши Ввод нужно ввести код: Private Sub Dir1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Dir1.Path = Dir1.List(Dir1.ListIndex) End Sub Здесь свойство ListIndex характеризует маркированную пользователем строку, см. ниже.

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

  ChDrive имя дискового устройства - перейти на другое дисковое устройство,

ChDir путь - перейти в другой каталог,

MkDir путь - создать каталог,

RmDir путь - удалить каталог,

FileCopy источник, цель - копировать файл.

SetAttr - установить атрибуты файла/каталога; допускается комбинация атрибутов.

  Информация об атрибутах дана в табл. 3.1

  Таблица 3.1. Атрибуты файлов Значение атрибута Имя константы Пояснение 0 vbNormal Свободный доступ 1 vbReadOnly Только для чтения 2 vbHidden Скрытый 4 vbSystem Системный 8 vbVolume Дисковое устройство 16 vbDirectory Каталог 32 vbArchive Архив   Практическая работа 17. Элементы управления DriveListBox, DirListBox и FileListBox Для приобретения навыков работы с файловой системой выполнить следующее:

  Создать на форме элементы управления DriveListBox, DirListBox и FileListBox, рис. 3.1, синхронизировать работу объектов, см. соответствующие процедуры, приведенные выше,

создать на форме командные кнопки: Path для процедуры вывода пути и меню в поля меток, см. код и рис. 3.1,

Copy NET14.ICO для процедуры копирования файла (здесь - файла NET14.ICO) с заданием имени файла в процедуре и выводом данных в поле метки, см. код и рис. 3.1,

Copy File1 для процедуры копирования файла (здесь - файла File1) с заданием файла путем маркировки его имени в списке файлов FileListBox и выводом данных в поле метки, см. код и рис. 3.1,

Make Directory для создания каталогов, см. код и рис. 3.1,

 

ввести код данный ниже: ' синхронизация работы элементов управления и ' обеспечение вывода содержимого каталогов при ' нажатии клавиши Enter Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Dir1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Dir1.Path = Dir1.List(Dir1.ListIndex) End Sub Private Sub Command1_Click() ' вывод пути и имени файла Label1 = Drive1: Label2 = Dir1: Label3 = File1 End Sub ' процедура многократного копирования файла ' последовательным нажатием командной кнопки Private Sub Command3_Click() Static i As Integer FileCopy "A:\Net14.ICO", "A:\FileN" ' вывод имени копируемого файла и числа копирований Label4 = File1 & " Copy " & i +1 i = i + 1 End Sub ' процедура копирования файла путём маркировки файла в ' списке FileListBox и последующего старта ' соответствующей процедуры Private Sub Command4_Click() Static i As Integer Print File1: FileCopy File1, "FileN": Label5 = File1 & " Copy " & i + 1 i = i + 1 End Sub ' создание каталогов Private Sub Command2_Click() MkDir а1: MkDir а2 End Sub

стартовать проект и затем: в списке DriveListBox выбрать, например, дисковое устройство А:. Маркировкой имени каталога и последовательным нажатием клавиши Enter вывести на экран содержимое. Маркировать некоторый файл (здесь - NET14.ICO), сделать щелчок на кнопке Path,

сделать щелчок на кнопке Copy NET14.ICO,

сделать щелчок на кнопке Copy File1,

сделать щелчок на кнопке Make Directory.

 

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

  Таблица 3.2. Средства работы с файловой системой Имя Назначение FileSystemОbject Обеспечение доступа к другим объектам и вывода информации о файловой системе. Создаваемый объект описывается с использованием ключевого слова New: Dim fileSys As New FileSystemObject TextStream Создание и чтение потоков данных Drive Доступ к дисковым устройствам Folder Работа с папками File Работа с файлами   Для использования объектов нужно подключить DLL, содержащую эти объекты. Функции DLL представляют собой откомпилированный код (примером являются диалоговые окна Открыть/Сохранить, выводимые при открытии/сохранении объектов; эти окна вызываются из DLL, поэтому ими можно пользоваться в любой программе). Для подключения нужно выполнить следующее: меню Разработать > Ccылки > сделать щелчок на флажке Microsoft Scripting Runtime (SCRUN.DLL).

  Практическая работа 18. Объекты файловой системы. Использование объекта CommonDialog Проводится работа с объектом TextStream:

  создание объекта stream - потока данных (текстового файла). Для создания используется метод CreateTextFile () объекта FileSystemObject,

запись данных в файл с использованием метода Write объекта TextStream,

чтение файла с использованием метода Read объекта TextStream.

  Работа выполняется с использованием объекта CommonDialog, его функции, используемые в данном случае, описаны под комментариями в коде, данном ниже. Объект CommonDialog нужно включить в коллекцию инструментов: меню Проект > Компоненты > Управления > Microsoft CommonDialog Control, затем cледует поместить его на форму и присвоить значение свойству Name (здесь - cdlgStudy ).

  Для создания возможности использования объектов файловой системы нужно подключить библиотеку DLL, содержащую эти объекты: меню Разработать > Ccылки > Microsoft Scriptlet Component (сделать щелчок на соответствующем элементе управления CheckBox).

  Последовательность действий:

  создать на форме 2 элемента управления CommandButton, рис. 3.2 (справа вверху),

для ввода/вывода текста создать на форме 2 текстовых поля (Name = txtInput и Name = txtOutput), см. код и рис. 3.2, в центре (свойство Multiline = -1: ' True),  

Рис. 3.2.  Объекты файловой системы; объект CommonDialog. Форма после старта  

 

вывести на форму элемент управления CommonDialog, см. выше,

ввести код, данный ниже, стартовать проект и далее: сделать щелчок на верхней командной кнопке - ввести в диалоговом окне Открытие файла имя файла,

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

ввести текст в левое текстовое поле,

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

сделать щелчок на нижней командной кнопке - чтение файла, см. рис. 3.2 Option Explicit ' описание объекта fileSys Dim fileSys As New FileSystemObject Dim stream As TextStream 'описание объекта поток данных Dim str As String, 'описание строки данных Dim fileName As String 'описание имени создаваемого файла ' ввод имени файла, создание потока данных, ' закрыть объект Private Sub Command1_Click() ' для открытия стандартного диалогового окна ' использовать метод ShowOpen объекта CommonDialog cdlgStudy.ShowOpen fileName = cdlgStudy.FileName ' задать имя файла ' создать поток данных с заданным именем Set stream = fileSys.CreateTextFile(fileName, True) ' строковые данные получить вводом в текстовое поле str = txtInput.Text ' запись данных: использовать метод Write объекта stream stream.Write (str) ' использовать метод Close для того, чтобы закрыть объект stream.Close End Sub Private Sub Command2_Click() ' чтение потока данных ' использовать метод ShowOpen объекта CommonDialog cdlgStudy.ShowOpen fileName = cdlgStudy.FileName ' определить имя файла ' открыть поток данных Set stream = fileSys.OpenTextFile(fileName) ' чтение: выполнять конкатенацию до тех пор, пока не ' появится признак конца файла Do While stream.AtEndOfStream <> True str = str & stream.Read(1) Loop stream.Close ' закрыть поток данных txtOutput.Text = str ' вывести данные в текстовое поле End Sub

 

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

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

  Последовательный (Sequential) доступ При последовательном доступе записи считываются последовательно одна за другой; доступ применяется в основном при работе с текстовыми файлами. Сначала используется инструкция Open - открыть файл, синтаксис:

  Open путь_имя_файла For Input |Output | Append As [#]номер_файла

  путь_имя_файла - путь и имя файла,

Input - открыть файл для чтения,

Output - открыть файл для записи,

Append - открыть файл для добавления в него записей,

As [#]номер_файла - присваиваемый номер; открытый файл после работы с ним должен быть закрыт и тот же самый номер может быть использован снова.

  Инструкция Close [[#]номер_файла, [#]номер_файла :] используется для закрытия файла. Для записи/чтения используются инструкции Write/Input:

  Write #1, "A Happy New Millennium !!!", " : ", - запись данных, стоящих после запятой,

Input #1, a1, a2, : - чтение данных из файла (a1, a2 : - переменные, разделeнные запятыми, в которые читаются данные из файла).

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

  Print #1, "A Happy New Millennium !!!", " : ".

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

  Open имя_файла For Random [Access - дост][Lock] As [#]ном_файла [Len = длина записи]

  имя_файла - имя файла,

Access - доступ задаeт права доступа к файлу. Ниже даны типы доступа и соответствующие примеры:

чтение - Open "file1.dat" For Random Access Read As #1,

запись - Open "file1.dat" For Random Access Write As #1,

чтение и запись - Open "file1.dat" For Random Access Read Write As #1,

 

без указания - Open "file1.dat" For Random As #1,

Lock определяет права доступа к открытому файлу пользователя/процесса при коллективном использовании:

Shared - все процессы могут писать в файл и считывать из файла,

Lock Read Write - запрет записи в файл и считывания из файла,

Lock Read - запрет считывания из файла,

Lock Write - запрет записи в файл,

As [#]номер_файла - номер файла,

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

  Инструкция Close [[[#]номер_файла][, [#]номер_файла] :] используется для закрытия файла.

  Для записи/чтения используются инструкции Put/Get:

  Put [#]номер_файла, [номер записи] имя_переменной

  номер_файла - номер открытого файла,

номер записи - номер записи, в которую начинается запись данных (записи нумеруются с 1. Если "номер записи" отсутствует, то подразумевается номер следующей записи; его пропуск указывается наличием вместо него запятой, например: Put #2,,),

имя_переменной - имя переменной, содержащей данные, которые будут записаны в файл,

  Get [#]номер_файла, [номер записи] имя_переменной

  номер_файла - номер открытого файла,

номер записи - номер записи, с которой начнeтся считывание данных,

имя_переменной - имя переменной, в которую проводится считывание.

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

  Практическая работа 19. Работа с файлами: запись данных в файл, чтение из файла Приводятся примеры работы с файлами, пояснения даны под комментариями к коду. Создать требуемые элементы управления, ввести код, данный ниже, см. также рис. 3.3 (схема формы) и рис. 3.4

   

Рис. 3.3.  Схема формы  

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

  Dim a1 As String, a2 As String, a3 As String, a4 As String Dim a5 As String, a6 As String, d1 As Integer Dim j As Integer, mass(6) As String, nomZ As Integer Dim b1 As String, b2 As String, b3 As String, b4 As String Private Sub Form_Load() ' присвоить значения переменным и вывести в поле List1 a1 = "a": a2 = "b": a3 = "c": a4 = "d" List1.List(0) = a1: List1.List(1) = a2 List1.List(2) = a3: List1.List(3) = a4 End Sub Private Sub Command1_Click() ' запись в файл ' открыть файл для записи; файл можно просмотреть в ' приложении "Блокнот" Open "file11.txt" For Output As #1 Write #1, "Name", a1, a2, a3, a4 ' запись в файл Close #1 ' закрыть файл End Sub Private Sub Command2_Click() ' запись в файл Open "file22.txt" For Output As #1 ' запись в файл строки и данных из поля списка в 4 ' строки (записи) Write #1, "Name" For j = 0 To 3 Write #1, List1.List(j) Next j Close #1 End Sub  

Рис. 3.4.  Работа с файлами  

  19в. Последовательный доступ: чтение данных из файла в переменные, пока не появится признак конца файла Private Sub Command3_Click() ' открыть файл, созданный ранее, для чтения Open "file11.txt" For Input As #1 Input #1, b1, b2, b3, b4 ' чтение данных в переменные b1 - b4 Close #1 Label1 = b1 & " " ' вывод результата в поле метки Label1 = Label1 & b2 & " ": Label1 = Label1 & b3 & " " Label1 = Label1 & b4 & " " End Sub ' очистка поля метки щелчоком на поле метки Private Sub Label1_Click() Label1 = "" End Sub Private Sub Command4_Click() Open "file22.txt" For Input As #1 ' открыть файл для чтения ' считывать данные, пока не появится признак конца файла j = 0 Do While Not EOF(1) Input #1, b1 List2.List(j) = b1 ' вывести в поле списка j = j + 1 Loop Close #1 End Sub 19с. Доступ Random: запись, чтение ' При загрузке формы выводится сообщение "Сделать ' двойной щелчок на форме", после чего поля List3 и ' List4 заполняются данными (cм. процедуру Form_DblClick()) Private Sub Form_Load() ' сделать двойной щелчок на форме Label3.BackColor = RGB(230, 0, 0) Label3 = "Make DblClick on the form !!" End Sub Private Sub Form_DblClick() For j = 0 To 11 ' заполнить поля нулями, чтобы иметь доступ ' к любой из строк List4.List(j) = 0 List5.List(j) = j ' заполнить поля номерами строк Next j End Sub Private Sub Command5_Click() ' запись в файл Open "file33.txt" For Random As #1 For j = 0 To 11 ' выбор номера записи случайным образом nomZ = Int(Rnd * 10 + 1) ' записать в файл под номером записи nomZ данные, ' хранящиеся в переменной j Put #1, nomZ, j List4.List(nomZ - 1) = nomZ & " " & j ' вывести результат Next j Close #1 End Sub Private Sub Command6_Click() ' чтение из файла Open "file33.txt" For Random As #1 ' открыть тот же файл For j = 0 To 11 ' выбор номера записи, которую нужно считать nomZ = Int(Rnd * 10 + 1) ' считать из номера записи nomZ в переменную d1 Get #1, nomZ, d1 List5.List(j) = d1 ' вывести в поле списка Next j Close #1 End Sub 19d. Ввод данных в диалоговом режиме, запись, чтение блоками по нескольку элементов Записать данные типа String в файл по 3 элемента в строку, считать данные из файла в массив группами по 2 элемента.

  Private Sub Form_Load() ' объявление: "Ввести данные !!" Label2.BackColor = RGB(200, 0, 0) Label2 = "Input !!" End Sub ' введенные в диалоговом режиме в 6 текстовых полей ' данные, присвоить значениям переменных а1 - а6 Private Sub Text1_Change() a1 = Text1 End Sub Private Sub Text2_Change() a2 = Text2 End Sub Private Sub Text3_Change() a3 = Text3 End Sub Private Sub Text4_Change() a4 = Text4 End Sub Private Sub Text5_Change() a5 = Text5 End Sub Private Sub Text6_Change() a6 = Text6 End Sub Private Sub Command7_Click() ' запись в файл по 3 элемента в строку Open "file44.txt" For Output As #1 Write #1, a1, a2, a3 Write #1, a4, a5, a6 Close #1 End Sub Private Sub Command8_Click() ' считать из файла по 2 элемента в массив и ' вывести на экран Open "file44.txt" For Input As #1 j = 0 Do While Not EOF(1) Input #1, a1, a2 mass(j) = a1: mass(j + 1) = a2 List3.List(j) = mass(j): List3.List(j + 1) = mass(j + 1) j = j + 2 Loop Close #1 End Sub Практическая работа 20. Контрольное задание Создать 2 массива (m1(2), m2(2)) данных типа String, создать 3-й массив m3(2), элементы которого получаются попарным склеиванием данных типа String, вводимых в текстовые поля,

выполнить сравнение (оператор Like ) операнда, вводимого в текстовое поле с шаблоном - элементами массива m3(2),

записать 6 элементов массивов в файл в 2 строки,

стартовать процедуру Timer1_Timer () после создания 4-ого массива mf(2),

сделать переход к форме 2,

считать все данные из файла по 3 элемента в массив,

вывести на экран в массив поля списка.

  Последовательность действий:

  создать на форме 2 поля списка для вывода массивов m1(2), m2(2) и процедуру Form_Load (),

создать на форме 2 массива текстовых полей из 2-х элементов для ввода данных и поле List3 для вывода элементов 3-его массива, см. процедуру Command1_Click(),

создать на форме текстовое поле Text3 для ввода операнда, сравниваемого с шаблоном и поле метки Label1 для вывода результатов сравнения, см. прцедуру Command2_Click(),

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

ввести процедуру Timer1_Timer (),

создать вторую форму и на ней - массив поля списка для вывода результатов считывания данных из файла (см. процедуры Command1_Click() и Command2_Click() второй формы) и 2 командные кнопки,

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

   

Рис. 3.5.  Схема формы  

  Form1

  (General) (Declarations) Dim j As Integer ' описание переменных для хранения значений операнда и ' шаблона Dim op1 As String, sch As String Dim res As Boolean ' переменная для работы с оператором Like Dim m1(2) As String, m2(2) As String, m3(2) As String Dim a As Integer, b As Integer ' описание вспомогательного массива и переменных, ' используемых для старта процедуры Timer1_Timer() Dim mf(2) As Integer Dim ffa As String, ffb As Integer Private Sub Form_Load() ' создание массивов и вывод его элементов For j = 0 To 1 a = Int(Rnd * 10 + 60): m1(j) = Chr(a): List1.List(j) = m1(j) b = Int(Rnd * 10 + 70): m2(j) = Chr(b): List2.List(j) = m2(j) Next j End Sub Private Sub Command1_Click() ' создание 3-его массива в диалоговом режиме For j = 0 To 1 m3(j) = Text1(j).Text & Text2(j).Text: List3.List(j) = m3(j) Next j ' создание массива, обеспечивающего старт процедуры ' Timer1_Timer() For j = 0 To 1 ffa = m3(j): ffb = Asc("ffa"): mf(j) = ffb Next j End Sub ' работа оператора Like и вывод результатов Private Sub Command2_Click() op1 = Text3.Text ' ввод операнда For j = 0 To 1 sch = m3(j): res = op1 Like sch If res Then Label1.Caption = "ДА": GoTo 300 Next j Label1.Caption = "НЕТ" 300 End Sub Private Sub Command3_Click() ' запись в файл Open "ff.txt" For Output As #1 Write #1, m1(0), m1(1), m2(0) Write #1, m2(1), m3(0), m3(1) Close #1 End Sub ' процедура, обеспечивающая перемещение поля метки после ' создания массива Private Sub Timer1_Timer() Label2.Left = Int(200 * Rnd * mf(0)) Label2.Top = Int(150 * Rnd * mf(1)) End Sub Private Sub Form_Click() Unload Me Form2.Show End Sub Form2

  General Declarations Dim m4(6) As String, j As Integer, i As Integer Dim k1 As String, k2 As String, k3 As String Private Sub Command1_Click() ' чтение из файла по 3 элемента Open "ff.txt" For Input As #1 j = 0 Do While Not EOF(1) Input #1, k1, k2, k3 m4(j) = k1: m4(j + 1) = k2: m4(j + 2) = k3 j = j + 3 Loop Close #1 End Sub Private Sub Command2_Click() ' вывод в массив ListBox For i = 0 To 2 For j = 0 To 1 List1(i).List(j) = m4(2 * i + j) Next j, i End

Соседние файлы в папке INTUIT Лекции Visual Basic