Обмен данными через xml и ftp (кто-то сказал веб-сервисы?)

Posted: Сентябрь 24, 2010 in .NET

Предположим, что нам надо дописать какую-то функциональность к уже существующей системе. Эта система была написана давно, на языках, о которых мы слышали на уроках истории, а сейчас у нас стоит VS2008 и мы используем C#. В этой существующей системе есть база, где хранятся все клиенты. База закрытая, а нам надо каждый месяц скидывать информацию об указанных услугах для этих клиентов. Про веб-службы на стороне заказчика никто не слышал. Хорошо, что хоть про xml знают, но вот xsd уже вызывает некоторые затруднения. Ок, будем обмениваться данными через xml предварительно сжав их архиватором zip.

Можно взять стандартные библиотеки и сжимать поток, но для простоты лучше использовать более developer-friendly библиотеки. Одной из них является ZipForge.NET. Это довольно удачный порт аналогичный библиотеки для Delphi. Пример использования показан ниже.

ZipForge archiver = new ZipForge
{
    FileName = zipFileName,
    BaseDir = @"C:\",
    CompressionMethod = ComponentAce.Compression.Archiver.CompressionMethod.Deflate
};
archiver.OpenArchive(FileMode.Create);
archiver.AddFiles(Path.GetFileName(fileName));
archiver.CloseArchive();
Console.WriteLine(zipFileName);

Далее эти файлы нужно отправить на ftp-сервер. Стандартные средства .NET для работы с ftp просто отвратительны. Например нельзя при подключении выбрать произвольный порт. Даже если вы его укажите в ftp-адресе, программа все-равно будет пытаться подключиться на стандартный 21 порт. Причем ребята из команды по разработке этих библиотек обещали исправить это в .NET 4.0, но так этого и не сделали. Вообще в .NET полно недоделанных библиотек, одни WinForms чего стоят. Здесь тем хватит не на один пост.
Соответственно возьмем еще одну developer-friendly библиотеку для работы с фтп — edtFTPnet. Благо, что здесь возможностей поболее. Чуть ниже показан класс, который я часто использую для отправки/скачивания файла.

namespace FtpLibrary
{
    public class FtpRoutine
    {
        //лучше не использовать HostName
        //потому что сервер в ответ может вернуть IP
        public string FtpIP {get;set;}
        public string FtpUserName {get;set;}
        public string FtpPassword {get;set;}
        public int FtpPort {get;set;}

        public static bool UploadWithFtpNet(string filename)
        {
            FTPConnection ftpConnection = new FTPConnection();

            ftpConnection.ServerAddress = FtpIP;
            ftpConnection.UserName = FtpUserName;
            ftpConnection.Password = FtpPassword;
            ftpConnection.ServerPort = FtpPort;

            ftpConnection.Connect();

            ftpConnection.UploadFile(filename, Path.GetFileName(filename));

            ftpConnection.Close();

            return true;
        }

        public static bool DownloadWithFtpNet(string filename)
        {
            FTPConnection ftpConnection = new FTPConnection();

            ftpConnection.ServerAddress = FtpIP;
            ftpConnection.UserName = FtpUserName;
            ftpConnection.Password = FtpPassword;
            ftpConnection.ServerPort = FtpPort;

            ftpConnection.Connect();

            //очень важно
            string[] files = ftpConnection.GetFiles();

            ftpConnection.DownloadFile(filename, Path.GetFileName(filename));

            ftpConnection.Close();

            return true;
        }
    }
}
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s