Обновление программы через FTP - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Хотел спросить. Написал апдейтор для своей программы, но он работает только с протоколом http. Как организовать скачивание с FTP сервера? Изменение ответа и запроса не очень помогло.
        private void button1_Click(object sender, EventArgs e)
        {
            Uri uri = new Uri("ссылка");//
            webClient.DownloadFileAsync(uri, "имя файла");
            webClient.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
            webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(webClient_DownloadFileCompleted);
        }
void webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            //-------Перезаписываем version.ini--
            string localVersionFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "version.ini");
            string ServerVersionFile = "ссылка";
            if (File.Exists(localVersionFile))
            {
                string localVersion = null;
                string ServerVersion = null;
                using (StreamReader sr = File.OpenText(localVersionFile))
                    localVersion = sr.ReadLine();
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServerVersionFile); // Веб запрос к нашему серверу
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Ответ сервера
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))// Используем чтение потока данных
                    ServerVersion = reader.ReadToEnd();
                if (!string.IsNullOrWhiteSpace(localVersion))
                {
                    using (StreamWriter sw = new StreamWriter(localVersionFile))
                        sw.Write(ServerVersion);
                }
                MessageBox.Show("Загрузка успешно завершена");
                progressBar1.Value = 100;
                label1.Visible = true;
                Application.Exit();
            }
        }

Решение задачи: «Обновление программы через FTP»

textual
Листинг программы
namespace Updater
{
    public partial class FormUpdater : Form
    {
        public static string my_version = "1.23";
 
        // Ссылки для скачивания
        private string url_version = "http://адрессайта/version.txt";
        private string url_program = "http://адрессайта/updater.exe";
        private string url_foruser = "http://адрессайта/index.php";
 
        private string my_filename;
        private string up_filename;
 
        // Признак, что началось скачивание обновления, требуется ожидание завершения процесса
        private bool is_download;   public bool download() { return is_download; }
 
        // Признак, что обновление не требуется или закончено, можно запускать программу.
        private bool is_skipped;    public bool skipped()  { return is_skipped; }
 
        public FormUpdater()
        {
            my_filename = get_exec_filename(); // имя запущенной программы
            up_filename = "new." + my_filename; // имя временного файла для новой версии
            
            string[] keys = Environment.GetCommandLineArgs();
 
            if (keys.Length < 3)
                do_check_update();
            else 
            {
                if (keys[1].ToLower() == "/u")
                    do_copy_downloaded_program(keys[2]);
 
                if (keys[1].ToLower() == "/d")
                    do_delete_old_program(keys[2]);
            }
        }
 
        private void do_check_update()
        {
            string new_version = get_server_version(); // Получаем номер последней версии
 
            if (my_version == new_version) // Если обновление не нужно
            {
                is_download = false;
                is_skipped = true; // Пропускаем модуль обновления
            }
            else
                do_download_update(); // Запускаем скачивание новой версии
        }
 
        private void do_download_update()
        {
            InitializeComponent();
            label_status.Text = "Скачивается файл: " + url_program;
            download_file();
            is_download = true; // Будем ждать завершения процесса
            is_skipped = false; // Основную форму не нужно запускать
        }
 
        private void download_file()
        {
            try
            {
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
                webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
                webClient.DownloadFileAsync(new Uri(url_program), up_filename);
            }
            catch (Exception ex)
            {
                error(ex.Message + " " + up_filename);
            }
        }
 
        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progress_download.Value = e.ProgressPercentage;
        }
 
        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            // Запускаем второй этап обновления
            run_program(up_filename, "/u "" + my_filename + """);
            this.Close();
        }
 
        private void run_program(string filename, string keys)
        {
            try
            {
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo.WorkingDirectory = Application.StartupPath;
                proc.StartInfo.FileName = filename;
                proc.StartInfo.Arguments = keys; // Аргументы командной строки
                proc.Start(); // Запускаем!
            }
            catch (Exception ex)
            {
                error(ex.Message + " " + filename);
            }
        }
 
 
        void do_copy_downloaded_program(string filename)
        {
            try_to_delete_file(filename);
            try
            {
                File.Copy(my_filename, filename);
                // Запускаем последний этап обновления
                run_program(filename, "/d "" + my_filename + """);
                is_download = false;
                is_skipped = false;
            }
            catch (Exception ex)
            {
                error(ex.Message + " " + filename);
            }
        }
 
        void do_delete_old_program(string filename)
        {
            try_to_delete_file(filename);
            is_download = false;
            is_skipped = true;
        }
 
        private void try_to_delete_file(string filename)
        {
            int loop = 10;
            while (--loop > 0 && File.Exists(filename))
                try { 
                    File.Delete(filename);
                } catch {
                    Thread.Sleep(200);
                }
        }
 
        private string get_server_version()
        {
            try
            {
                WebClient webClient = new WebClient();
                return webClient.DownloadString(url_version).Trim();
            }
            catch
            {
                // Если номер версии не можем получить, 
                // то программу даже и не надо пытаться.
                return my_version; 
            }
        }
 
        private void error(string message)
        {
            if (DialogResult.Yes == MessageBox.Show(
                "Ошибка обновления: " + message +
                    "\n\nСкачать программу вручную?",
                    "Ошибка", MessageBoxButtons.YesNo))
                OpenLink(url_foruser);
            is_download = false;
            is_skipped = false; // в случае ошибки ничего не запускаем
        }
 
        private void OpenLink(string sUrl)
        {
            try
            {
                System.Diagnostics.Process.Start(sUrl);
            }
            catch (Exception exc1)
            {
                if (exc1.GetType().ToString() != "System.ComponentModel.Win32Exception")
                    try
                    {
                        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("IExplore.exe", sUrl);
                        System.Diagnostics.Process.Start(startInfo);
                        startInfo = null;
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Запустить обозреватель, к сожалению, не удалось.\n\nОткройте страницу ручным способом:\n" + sUrl, "ОШИБКА");
                    }
            }
        }
 
        private string get_exec_filename()
        {
            string fullname = Application.ExecutablePath;
            string[] split = { "" };
            string[] parts = fullname.Split(split, StringSplitOptions.None);
            if (parts.Length > 0)
                return parts[parts.Length - 1];
            return "";
        }
    }
}

Оцени полезность:

8   голосов , оценка 3.625 из 5