.NET и С# глазами дельфиста

Задача

Напишем программу для обновления сайта, выложенного на ftp. Наша утилита должна будет анализировать изменения, произошедшие в локальной копии сайта и обновить только те файлы, которые отсутствуют или изменились со времени последнего обновления.

Инструменты

Разработка

Для хранения информации о синхронизации будем использовать простой текстовый файл из строк формата name=value. Для сопоставления информации файлу в name запишем его относительный путь, а в value нужную нам информацию (правда это приведет к невозможности использовать знак = внутри имени файла). Служебную информацию будем также хранить в этом файле в начале, предварив каждую строку служебной информации знаком ?, который не может встретиться в имени файла.
Пример:
?D=X:\Docs\My\site\
...
index.htm=945985558
...
art\gnom.htm=885433848
...

Для работы с файлами будем использовать классы из System.IO. В частности, отсканировать имена всех файлов в массив очень просто при помощи метода Directory.GetFiles. У такого простого подхода есть недостатки - при большем числе исключений по иерархии директорий мы вынуждены будем потратить время на сканирование не нужных нам файлов.

В качестве контрольной информации используем время изменения файла File.GetLastWriteTimeUtc (UTC позволит нам избежать проблем с переходом на летнее\зимнее время). Альтернативой могло бы быть вычисление Hash функции, например, CRC32 от содержимого, но это сильно замедлит обработку данных.

Для формирования списка различий возьмем сохраненный список файлов (Old) и сформируем текущий (New). Если эти два списка отсортировать и анализировать последовательно, то можно получить список Diff файлов необходимых для синхронизации:

Для отсылки изменений на ftp используем класс WebClient из System.Net. После установки свойства BaseAddress в нужный нам адрес ftp, можно использовать метод UploadFile для загрузки и обновления нужных файлов (относительный путь подойдет для копирования файла в нужную директорию ftp). Однако, этого недостаточно для того, чтобы создавать структуру каталогов на ftp и удалять файлы с ftp. Для установки авторизации используем объект NetworkCredential.

Единственная настройка программы не хранимая в файле - список последних файлов синхронизации. Его сохраняем в реестре, используя класс Registry из Microsoft.Win32. Однако нехорошо хранить пароли ftp в открытом виде в файле, поэтому их так же сохраняем в реестре использовав в качестве ключа хэш строки с url и именем пользователя. Также пароль конвертируем в base64 использую System.Text.

Недоделки

Архив программы с исходником

Наблюдения

Наблюдения SharpDeveloper 2.1

Hosted by uCoz