Обновление программы через 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 "";
}
}
}