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

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

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

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

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

textual
Листинг программы
  1. namespace Updater
  2. {
  3.     public partial class FormUpdater : Form
  4.     {
  5.         public static string my_version = "1.23";
  6.  
  7.         // Ссылки для скачивания
  8.         private string url_version = "http://адрессайта/version.txt";
  9.         private string url_program = "http://адрессайта/updater.exe";
  10.         private string url_foruser = "http://адрессайта/index.php";
  11.  
  12.         private string my_filename;
  13.         private string up_filename;
  14.  
  15.         // Признак, что началось скачивание обновления, требуется ожидание завершения процесса
  16.         private bool is_download;   public bool download() { return is_download; }
  17.  
  18.         // Признак, что обновление не требуется или закончено, можно запускать программу.
  19.         private bool is_skipped;    public bool skipped()  { return is_skipped; }
  20.  
  21.         public FormUpdater()
  22.         {
  23.             my_filename = get_exec_filename(); // имя запущенной программы
  24.             up_filename = "new." + my_filename; // имя временного файла для новой версии
  25.            
  26.             string[] keys = Environment.GetCommandLineArgs();
  27.  
  28.             if (keys.Length < 3)
  29.                 do_check_update();
  30.             else
  31.             {
  32.                 if (keys[1].ToLower() == "/u")
  33.                     do_copy_downloaded_program(keys[2]);
  34.  
  35.                 if (keys[1].ToLower() == "/d")
  36.                     do_delete_old_program(keys[2]);
  37.             }
  38.         }
  39.  
  40.         private void do_check_update()
  41.         {
  42.             string new_version = get_server_version(); // Получаем номер последней версии
  43.  
  44.             if (my_version == new_version) // Если обновление не нужно
  45.             {
  46.                 is_download = false;
  47.                 is_skipped = true; // Пропускаем модуль обновления
  48.             }
  49.             else
  50.                 do_download_update(); // Запускаем скачивание новой версии
  51.         }
  52.  
  53.         private void do_download_update()
  54.         {
  55.             InitializeComponent();
  56.             label_status.Text = "Скачивается файл: " + url_program;
  57.             download_file();
  58.             is_download = true; // Будем ждать завершения процесса
  59.             is_skipped = false; // Основную форму не нужно запускать
  60.         }
  61.  
  62.         private void download_file()
  63.         {
  64.             try
  65.             {
  66.                 WebClient webClient = new WebClient();
  67.                 webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
  68.                 webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
  69.                 webClient.DownloadFileAsync(new Uri(url_program), up_filename);
  70.             }
  71.             catch (Exception ex)
  72.             {
  73.                 error(ex.Message + " " + up_filename);
  74.             }
  75.         }
  76.  
  77.         private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  78.         {
  79.             progress_download.Value = e.ProgressPercentage;
  80.         }
  81.  
  82.         private void Completed(object sender, AsyncCompletedEventArgs e)
  83.         {
  84.             // Запускаем второй этап обновления
  85.             run_program(up_filename, "/u "" + my_filename + """);
  86.             this.Close();
  87.         }
  88.  
  89.         private void run_program(string filename, string keys)
  90.         {
  91.             try
  92.             {
  93.                 System.Diagnostics.Process proc = new System.Diagnostics.Process();
  94.                 proc.StartInfo.WorkingDirectory = Application.StartupPath;
  95.                 proc.StartInfo.FileName = filename;
  96.                 proc.StartInfo.Arguments = keys; // Аргументы командной строки
  97.                 proc.Start(); // Запускаем!
  98.             }
  99.             catch (Exception ex)
  100.             {
  101.                 error(ex.Message + " " + filename);
  102.             }
  103.         }
  104.  
  105.  
  106.         void do_copy_downloaded_program(string filename)
  107.         {
  108.             try_to_delete_file(filename);
  109.             try
  110.             {
  111.                 File.Copy(my_filename, filename);
  112.                 // Запускаем последний этап обновления
  113.                 run_program(filename, "/d "" + my_filename + """);
  114.                 is_download = false;
  115.                 is_skipped = false;
  116.             }
  117.             catch (Exception ex)
  118.             {
  119.                 error(ex.Message + " " + filename);
  120.             }
  121.         }
  122.  
  123.         void do_delete_old_program(string filename)
  124.         {
  125.             try_to_delete_file(filename);
  126.             is_download = false;
  127.             is_skipped = true;
  128.         }
  129.  
  130.         private void try_to_delete_file(string filename)
  131.         {
  132.             int loop = 10;
  133.             while (--loop > 0 && File.Exists(filename))
  134.                 try {
  135.                     File.Delete(filename);
  136.                 } catch {
  137.                     Thread.Sleep(200);
  138.                 }
  139.         }
  140.  
  141.         private string get_server_version()
  142.         {
  143.             try
  144.             {
  145.                 WebClient webClient = new WebClient();
  146.                 return webClient.DownloadString(url_version).Trim();
  147.             }
  148.             catch
  149.             {
  150.                 // Если номер версии не можем получить,
  151.                 // то программу даже и не надо пытаться.
  152.                 return my_version;
  153.             }
  154.         }
  155.  
  156.         private void error(string message)
  157.         {
  158.             if (DialogResult.Yes == MessageBox.Show(
  159.                 "Ошибка обновления: " + message +
  160.                     "\n\nСкачать программу вручную?",
  161.                     "Ошибка", MessageBoxButtons.YesNo))
  162.                 OpenLink(url_foruser);
  163.             is_download = false;
  164.             is_skipped = false; // в случае ошибки ничего не запускаем
  165.         }
  166.  
  167.         private void OpenLink(string sUrl)
  168.         {
  169.             try
  170.             {
  171.                 System.Diagnostics.Process.Start(sUrl);
  172.             }
  173.             catch (Exception exc1)
  174.             {
  175.                 if (exc1.GetType().ToString() != "System.ComponentModel.Win32Exception")
  176.                     try
  177.                     {
  178.                         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo("IExplore.exe", sUrl);
  179.                         System.Diagnostics.Process.Start(startInfo);
  180.                         startInfo = null;
  181.                     }
  182.                     catch (Exception)
  183.                     {
  184.                         MessageBox.Show("Запустить обозреватель, к сожалению, не удалось.\n\nОткройте страницу ручным способом:\n" + sUrl, "ОШИБКА");
  185.                     }
  186.             }
  187.         }
  188.  
  189.         private string get_exec_filename()
  190.         {
  191.             string fullname = Application.ExecutablePath;
  192.             string[] split = { "" };
  193.             string[] parts = fullname.Split(split, StringSplitOptions.None);
  194.             if (parts.Length > 0)
  195.                 return parts[parts.Length - 1];
  196.             return "";
  197.         }
  198.     }
  199. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут