Visual2000 · Архив статей А.Колесова & О.Павловой

Технология разработки приложений: практический пример на VB

Часть 1 (окончание)

Андрей Колесов

© Андрей Колесов, 2000
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" N 02/2001, компакт-диск.

Начало части 1

Окончание части 1:


Этап 2: модификация имен каталогов и ведение протокола работы

В каком направлении развивать наш проект? Здесь просматриваются следующие варианты:

  1. Провести преобразование кодировки текстовых файлов.
  2. Обеспечить ведение протокола работы.
  3. Выполнить автоматическую выборку файлов по дате.
  4. Предоставить пользователю возможность задавать имена каталогов ОТКУДА и КУДА.
  5. Кое-что еще...

Мой подход таков: следует сделать то, что реализуется быстрее всего и в то же время необходимо для работы. Для перекодировки файлов по крайней мере нужны кодовые таблицы Windows-1251 и KOI-8. Автоматическая выборка файла по дате — дело тоже не очень простое. К тому же без ведения протокола она проста не нужна. Итак, решено — ввод имен каталогов и протокол работы.

Шаг 8. Ввод имен каталогов, создание INI-файла проекта.

Казалось бы, самый простой вариант — использовать текстовые поля для имен каталогов. Можно также сделать специальные процедуры для выбора каталогов с помощью диалоговых окон. Все это будет выглядеть эффектно, но для реальной работы ни один вариант не годится. Во-первых, выбор каталогов должен производиться только в самом начале, при запуске утилиты (изменение их в процессе работы нужно просто запретить). Во-вторых, на конкретном компьютере имеется лишь фиксированная пара каталогов для подобного копирования. Поэтому менять каталоги следует только один раз — при установке утилиты на компьютер или при смене каталогов (ведь речь-то идет о копии Web-сайта!).

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

Для этого в процедуре Form_Load заменим две строки с начальным формированием переменных PathFrom и PathTo на обращение к процедуре:

Call InputIniFile

Затем напишем саму процедуру:

Public Sub InputIniFile()
  'Инициализация переменных утилиты CopyKoi8
  Dim iniFile$, lnIni%  
    
  lnIni = FreeFile  
  iniFile$ = App.Path + "\copykoi8.ini"  
  On Error GoTo ErrFile  
  Open iniFile For Input As #lnIni  
    ' файл существует  
    Input #lnIni, PathFrom  
    Input #lnIni, PathTo  
  Close #lnIni  
  Exit Sub
ErrFile:  'нет файла, установка по умолчанию
  PathFrom = "d:\my-sites\visualmy\"  
  PathTo = "e:\dreamwear\visual\"  
End Sub

Запустите проект. Сейчас файла INI нет, поэтому должны произойти установки путей по умолчанию. Теперь создайте файл CopyKoi8.INI в каталоге с проектом и убедитесь, что используются его данные.

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

"d:\my-sites\visualmy\"
"e:\tmp\"

Шаг 9. Создание Log-файла. Cоздадим пока Log-файл с фиксированным именем CopyKoi8.log в каталоге, где находится утилита. Для сохранения файлов для разных сеансов работы утилиты их можно переименовать вручную. <p> В разделе Declaration опишем переменную:

Dim lnLog  ' логический номер Log-файла

В конце процедуры Form_Load запишем обращение к Call LogFileStart, а в процедуру Form_Unload — Call LogFileFinish. Затем сформируем процедуры инициализации и закрытия Log-файла:

Public Sub LogFileStart()  
   ' инициализация Log-файла
   lnLog = FreeFile  
   Open App.Path + "\copykoi8.log" For Output As #lnLog  
   Print #lnLog, Me.Caption  
   Print #lnLog, lblFrom  
   Print #lnLog, lblTo  
   Print #lnLog, "Время начала: " & Date & " " & Time  
   Print #lnLog, "======="  
End Sub  
   
Public Sub LogFileFinish()  
   ' закрываем Log-файл
   ' статистика работы:
   Print #lnLog, "======="  
   Print #lnLog, lblCopy  
   Print #lnLog, lblConv  
   Print #lnLog, lblReplace  
   Print #lnLog, "Время начала: " & Date & " " & Time  
   Close #lnLog  
End Sub  

Замечание. Мы специально выделили линейные фрагменты кода в отдельные процедуры (можно было бы включить их прямо в Form_Load и Form_Unload), чтобы без необходимости не увеличивать размер процедур и подчеркнуть независимость этих операций.

Запустите проект и сразу же закройте его. Убедитесь, что файл сформирован там, где нужно, и содержит информацию такого вида:

Преобразование из Win в KOI8
Откуда: d:\my-sites\visualmy\ 
Куда:  e:\tmp\
Время начала: 23.10.00 19:44:48
Скопировано файлов    = 0
Перекодировано файлов = 0
Заменено файлов = 0
Время начала: 23.10.00 19:44:50

Шаг 10. Формирование содержательной части Log-файла. Добавьте всего одну строку кода в процедуру cmdCopy_Click (перед комментарием "обновление счетчиков на форме"):

Print #lnLog, FileTo & sCopy & sReplace ' запись в Log-файл  

Запустите проект и скопируете несколько файлов. Убедитесь, что внутри Log-файла появилась информация об обработанных файлах:

e:\tmp\index.htm Скопирован (замена)
e:\tmp\kol.gif Скопирован (замена)
e:\tmp\email.htm Скопирован (новый)
e:\tmp\proffi.htm Скопирован (новый)

Мы завершили второй этап разработки. Созданный вариант утилиты можно передавать пользователям, которые будут довольны наличием протокола работы и возможностью изменения имен исходных каталогов. Распечать Log-файл они смогут с помощью NotePad — мы пока не будем отвлекаться от более актуальных задач.

В начало статьи

Этап 3: перекодировка файлов

Теперь нам уже не избежать перекодировки файлов. Но сначала следует произвести небольшую перекомпоновку созданных процедур.

Сейчас наши процедуры сосредоточены в одном модуле формы, и поскольку их достаточно много, работать с ними не очень удобно. К тому же там есть одна процедура, функциональность которой будет возрастать и которая понадобится для работы в других режимах. Короче говоря, было бы полезно немедленно (дальше будет сложнее) отделить ее от конкретной формы и записать в отдельный модуль кода. Речь, конечно же, идет о процедуре cmdCopy_Click, где выполняются операции преобразования файла.

Шаг 11. Создадим в проекте новый модуль кода и назовем его CopyFile.BAS. Далее скопируем в него процедуру cmdCopy_Click и переименуем в CopyConvFile. Теперь нужно "склеить" эти процедуры, удалив из каждой из них ненужный код.

  1. Переместим из модуля frmCopy8.frm в CopyFile.bas все описания переменных в секции Declaration, заменим описания Dim на Public (то есть они будут общими переменными проекта).

  2. В процедуре CopyConvFile исправим заголовок:
    Public Sub CopyConvFile(PathCur$, ByVal FileFrom$)
      '
      ' Копирование и перекодирование файла
      ' PathCur  - имя текущего каталога
      ' FileFrom - имя файла (внутри текущего каталога)
    

  3. Далее из этой процедуры нужно удалить код:
      FileFrom = filList.FileName 
      If FileFrom = "" Then 
        MsgBox "Не выбран файл!": Exit Sub
      End If
    

  4. Затем двумя строчками ниже заменим в двух местах filList.Path на PathCur. В конце процедуры заменим:
    Call CountCaption  
    
    на:
    Call frmCopy8.CountCaption  ' нужно указать объект, где находится процедура
    

    Внимание! Переменная FileFrom будет меняться внутри процедуры, поэтому используем режим передачи параметра по значению (в вызывающей процедуре передаваемая переменная не будет меняться).

  5. В процедуре cmdCopy_Click нужно удалить почти все, оставив только следующий код:

    Private Sub cmdCopy_Click()
      If filList.FileName = "" Then  
        MsgBox "Не выбран файл!": Exit Sub
      End If
      ' преобразование файла:
      Call CopyConvFile(filList.Path, filList.FileName)  
    End Sub
    

Запустите проект и убедитесь, что все работает по-прежнему.

Шаг 12. Перекодировка файлов. Включите в процедуру CopyConvFile код для перезаписи текстовых файлов:

If FileExt$ = ".txt" Or FileExt$ = ".htm" Then
    'перекодирование + копирование
    Dim WinLine$, Koi8Line$
    lnFrom = FreeFile: Open FileFrom For Input As #lnFrom  
    lnTo = FreeFile: Open FileTo For Output As #lnTo  
    While Not EOF(lnFrom)  
      Line Input #lnFrom, WinLine  
      Koi8Line = WinLine  
      Print #lnTo, Koi8Line  
    Wend
...

Очевидно, что пока этот код просто без перекодировки переписывает текстовый файл. И тем не менее...

БиЮЗапустите проект и убедитесь, что теперь при указании HTM- или TXT-файлов производится изменение счетчика "Перекодировано", а в Log-файле появились записи с комментарием "Перекодирован Win -> KOI8 (замена)". Проверьте, точно ли выполняется копирование текста.

Для перекодировки символов мы используем процедуру, о которой рассказывалось еще в нашем Совете 120. Подключим к нашему проекту созданный еще три года назад модуль Str_che.BAS (его можно скачать здесь) и в приведенном выше коде вместо присвоения Koi8Line = WinLine запишем:

Koi8Line = RusSymOther$(WinLine, 3, 2) 'из Win/cp1251 в KOI-8

Запустите проект и убедитесь, что теперь HTM- или TXT-файлы при копировании перекодируются из кодировки Windows-1251 в KOI-8.

Шаг 13. Вполне вероятно, что будет полезен вариант, при котором возникнет необходимость копировать все файлы без перекодировки. Для этого нужно разместить на форме флажок с именем chkTxtHtm и установить для него в исходном положении свойство Value = 1 (Checked). Для использования этого флажка следует немного модифицировать код процедуры CopyConvFile:

Public Sub CopyConvFile(PathCur$, ByVal FileFrom$, CheckConv%)  
...
  ' CheckConv = 1 - перекодировать TXT/HML
  '           = 0 - не нужно
...
  If (CheckConv = 1) And (FileExt$ = ".txt" Or FileExt$ = ".htm") Then  
...

Обращение к ней из cmdCopy_Click будет выглядеть теперь следующим образом:

Call CopyConvFile(filList.Path, filList.FileName, chkTxtHtm.Value)  

Запустите проект и убедитесь, что он правильно работает с учетом положения флажка.

В начало статьи

Заключение

Третья версия нашей утилиты реализована (рис. 2), и ее можно передать пользователям.

Рис. 2.

Она позволяет решать два важных пункта (2-й и 3-й) нашей исходной задачи — копирование и перекодировку файлов. Эта операция теперь будет выполняться быстрее, а самое главное — надежнее:

  1. Файлы гарантированно копируются в нужное место (в соответствующий подкаталог).
  2. Обеспечена правильность перекодирования (раньше можно было забыть что-то перекодировать или, наоборот, забыть обработать какие-то файлы).
  3. Обеспечено получение точного протокола с измененными файлами, который затем переписывается на Web-сервер. Для контроля его можно сверить с исходным списком.

Программный проект, который у нас получился к этому моменту можно загрузить в виде ZIP-файла (13 Кб, copykoi8.zip).

Следующий этап нашей работы — автоматическое получение исходного списка файлов, которые нужно обработать. Об этом в следующей части статьи. Надеюсь она появится, если это будет кому-то интересно.

В начало статьи