Добавлен 12.11.2002 Работа с файлами.
В этом статье я расскажу как
работать с объектами Scripting.FileSystemObject и Scripting.TextStream.
Итак, задача:
Недавно мне потрбевалось
управлять файлом настройки ASP-проекта. Название
этого файла, допустим был "c:\inetpub\wwwroot\file1.inc".
Примерное содержание этого
файла:
<%
const CountRecordOnPage = 3
const ODBC_Source="Data Source=MySource"
Dim ConString
ConString = "Provider=MSDASQL.1;Persist Security Info=True;User
ID=admin;" & ODBC_Source & ";Mode=ReadWrite"
...
%>
Этот файл является файлом
настроек для Web-приложения. При настройки этого
приложения нужно создать ODBC-источник к базе
данных. (Пуск->Настройка->ODBC Data Sources (32bit). Наша
цель создать Windows-приложение для изменения
значения "Data Source" в файле
"c:\inetpub\wwwroot\file1.inc". Заранее неизвестно в
какой строке находится этот параметр, но
известно, что количество строк не превышает 100.
Задача сводится к двум меньшим
задачам: чтение параметра "Data Source" из файла,
запись "Data Source" в файл.
Чтение из файла.
Создайте проект с одной формой.
Разместите компонент TextBox на форме. Назовите
компонент txtDSN.
Вставьте ссылку на библиотеку
Scripting (Меню Project->References "Microsoft Scripting Runtime").
Эта библиотека позволит работать с объектами
Scripting.FileSystemObject и Scripting.TextStream.
На событие Form_Load вставьте
следующий код:
Dim strTemp As String
Dim i As Integer
Dim j As Integer
Dim fs As Scripting.FileSystemObject
Dim txt As Scripting.TextStream
'SN - Create TextStream
Set fs = New Scripting.FileSystemObject
Set txt = fs.OpenTextFile("c:\inetpub\wwwroot\file1.inc", ForReading, False)
While Not txt.AtEndOfStream
strTemp = txt.ReadLine
'SN - Extract DSN name
i = InStr(strTemp, "const ODBC_Source=" & Chr(&H22) & "Data
Source=")
If i > 0 Then
j = Len("const ODBC_Source=" & Chr(&H22) & "Data Source=")
strTemp = Right(strTemp, Len(strTemp) - j - i + 1)
strTemp = Left(strTemp, Len(strTemp) - 1)
txtDSN.Text = strTemp
txtDSN.Enabled = True
End If
Wend
'SN - Destroy Text Stream
txt.Close
Set txt = Nothing
Set fs = Nothing
|
Разберем этот кусок.
Здесь мы считываем параметр "Data Source". В
читаемом файле есть строка 'const ODBC_Source="Data
Source=MySource"'.
Обратите внимание мы не знаем, сколько пробелов
стоит слева, а также, что в читаемой строке есть
двойные кавычки.
Первые две строки создают и открывают поток
текста для чтения:
Set fs = New Scripting.FileSystemObject
Set txt = fs.OpenTextFile("c:\inetpub\wwwroot\file1.inc", ForReading, False)
Последний параметр метода fs.OpenTextFile означает
создавать ли данный файл на диске. В данном
случае мы показали, что нет.
Затем мы в цикле читаем каждую строку из потока:
While Not txt.AtEndOfStream
strTemp = txt.ReadLine
...
Wend
Затем проверяем входимость подстроки "const
ODBC_Source=" & Chr(&H22) & "Data Source=" в строку
strTemp. Здесь Chr(&H22) является символ с
шестнадцатиричным кодом &H22 двойной кавычки.
Если подстрока входит в строку, то переменной i
присваевается номер первого символа строки, с
которого начинается вхождения. Если же нет
подстроки в данной строке, то i будет равна 0.
Если i больше 0, то
Выделяем правую часть (здесь это - <MySource">
j = Len("const ODBC_Source=" & Chr(&H22) & "Data Source=")
strTemp = Right(strTemp, Len(strTemp) - j - i + 1)
и избавляемся от послднего символа двойной
кавычки
strTemp = Left(strTemp, Len(strTemp) - 1)
Заносим получившуюся строку в TextBox, закрываем
поток и освобождаем память.
Запись в файл.
На событие Form_Unload (выгрузка формы
из памяти) вставьте следующий код
Dim strTemp As String
Dim strArray(100) As String
Dim i As Integer
Dim j As Integer
Dim fs As Scripting.FileSystemObject
Dim txt As Scripting.TextStream
'SN - Create TextStream
Set fs = New Scripting.FileSystemObject
Set txt = fs.OpenTextFile("c:\inetpub\wwwroot\file1.inc", ForReading, False)
j = 1
While Not txt.AtEndOfStream
strTemp = txt.ReadLine
'SN - Extract DSN name
If InStr(strTemp, "const ODBC_Source=" & Chr(&H22) & "Data
Source=") > 0 Then
strArray(j) = " const ODBC_Source=" & Chr(&H22) & "Data
Source=" & txtDSN.Text & Chr(&H22)
j = j + 1
Wend
txt.Close
Set txt = fs.OpenTextFile(txtIncFile.Text, ForWriting, True)
For i = 1 To j - 1
txt.WriteLine strArray(i)
Next i
'SN - Destroy Text Stream
txt.Close
Set txt = Nothing
Set fs = Nothing
boolWasChanged = False
Exit Sub |
Здесь нам тоже надо прочитать из
файла все строки, но мы их всех запишем в
строковый массив strArray(100). Причем, если нам
попадется подстрока "const ODBC_Source=" & Chr(&H22)
& "Data Source=", то сразу внесем в массив новую
строку:
j = 1
While Not txt.AtEndOfStream
strTemp = txt.ReadLine
'SN - Extract DSN name
If InStr(strTemp, "const ODBC_Source=" & Chr(&H22) & "Data
Source=") > 0 Then
strArray(j) = " const ODBC_Source=" & Chr(&H22) & "Data
Source=" & txtDSN.Text & Chr(&H22)
j = j + 1
Wend
Затем закроем текстовый поток и
откроем его для записи с атрибутом перезаписи
Set txt = fs.OpenTextFile(txtIncFile.Text, ForWriting, True)
А дальше сохраним все строки в
файл "c:\inetpub\wwwroot\file1.inc".
Вот и все.
В следующем выпуске я покажу как окрывать файл,
используя стандартный Windows диалог. И как работать
с ini-файлами. |