Visual2000 · Архив статей А.Колесова & О.Павловой
Андрей Колесов
© Андрей Колесов, 2000Окончание части 1:
В каком направлении развивать наш проект? Здесь просматриваются следующие варианты:
Мой подход таков: следует сделать то, что реализуется быстрее всего и в то же время необходимо для работы. Для перекодировки файлов по крайней мере нужны кодовые таблицы 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 — мы пока не будем отвлекаться от более актуальных задач.
Теперь нам уже не избежать перекодировки файлов. Но сначала следует произвести небольшую перекомпоновку созданных процедур.
Сейчас наши процедуры сосредоточены в одном модуле формы, и поскольку их достаточно много, работать с ними не очень удобно. К тому же там есть одна процедура, функциональность которой будет возрастать и которая понадобится для работы в других режимах. Короче говоря, было бы полезно немедленно (дальше будет сложнее) отделить ее от конкретной формы и записать в отдельный модуль кода. Речь, конечно же, идет о процедуре cmdCopy_Click, где выполняются операции преобразования файла.
Шаг 11. Создадим в проекте новый модуль кода и назовем его CopyFile.BAS. Далее скопируем в него процедуру cmdCopy_Click и переименуем в CopyConvFile. Теперь нужно "склеить" эти процедуры, удалив из каждой из них ненужный код.
Public Sub CopyConvFile(PathCur$, ByVal FileFrom$) ' ' Копирование и перекодирование файла ' PathCur - имя текущего каталога ' FileFrom - имя файла (внутри текущего каталога)
FileFrom = filList.FileName If FileFrom = "" Then MsgBox "Не выбран файл!": Exit Sub End If
Call CountCaptionна:
Call frmCopy8.CountCaption ' нужно указать объект, где находится процедура
Внимание! Переменная FileFrom будет меняться внутри процедуры, поэтому используем режим передачи параметра по значению (в вызывающей процедуре передаваемая переменная не будет меняться).
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-й) нашей исходной задачи — копирование и перекодировку файлов. Эта операция теперь будет выполняться быстрее, а самое главное — надежнее:
Программный проект, который у нас получился к этому моменту можно загрузить в виде ZIP-файла (13 Кб, copykoi8.zip).
Следующий этап нашей работы — автоматическое получение исходного списка файлов, которые нужно обработать. Об этом в следующей части статьи. Надеюсь она появится, если это будет кому-то интересно.