Обновление программы через 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 ""; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д