На главную

Добавлен 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-файлами.

Hosted by uCoz