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