Проверка версии обновления и скачивание файлов по FTP C#
Алгоритм действий:
- Проверить версию файлов на FTP и сверить версию файлов на локальной машине пользователя. (Возможно путём XML или Hash)
- Если версия на FTP новее, чем на локальной машине пользователя - скачать обновленные файлы (файлы, которые имеют более свежую дату изменения)
- Если данных файлов нет на машине пользователя - скачать все существующие файлы из директории FTP и залить в папку, указанную пользователем.
Вот как реализовал частично это я (проверка на существование нужных файлов и директорий):
private void labelAccept_MouseDown_1(object sender, MouseButtonEventArgs e)
{
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey("SOFTWARE\\SAMP");
key.SetValue(reg_pName, $"{textBoxPlayerName.Text}");
// проверка на существующую директорию
string currentDirectory = @"" + txtBoxPath.Text;
if (Directory.Exists(currentDirectory))
{
key.SetValue("gta_sa_exe", $"{txtBoxPath.Text}"); // path to game
MessageBox.Show("Путь к игре сохранен успешно!");
}
else if (!Directory.Exists(currentDirectory))
MessageBox.Show("Директория указана неверно, либо не существует!");
else
MessageBox.Show("Файл gta_sa.exe не найден!");
// сохранение состояний чек боксов
// здесь
}
Функция, которая устанавливает файлы с FTP, если нужные файлы не обнаружены (некорректно выводит размер файла):
private void get_install()
{
string ftp_login = "hidden";
string ftp_pass = "hidden";
// ftp
const string url = "ftp://hidden/Game.zip";
// exception
try
{
NetworkCredential _credentials = new NetworkCredential(ftp_login, ftp_pass);
// проверить подключение *удачно или нет*
// не знаю как, может сам найду, но буду благодарен за помощь
// запрос на размер загружаемых файлов с FTP
// Query size of the file to be downloaded
WebRequest sizeRequest = WebRequest.Create(url);
sizeRequest.Credentials = _credentials;
sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize;
int size = (int)sizeRequest.GetResponse().ContentLength;
MessageBox.Show(size.ToString());
// загрузка
WebRequest request = WebRequest.Create(url);
request.Credentials = _credentials;
request.Method = WebRequestMethods.Ftp.DownloadFile;
Settings st = new Settings();
using (Stream ftpStream = request.GetResponse().GetResponseStream())
using (Stream fileStream = File.Create(@"" + st.txtBoxPath.Text))
{
byte[] buffer = new byte[10240];
int read;
// попытка реализовать прогресс бар, который будет показывать прогресс загрузки
while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
{
fileStream.Write(buffer, 0, read);
int position = (int)fileStream.Position;
//ProgressBar1_Copy4.Invoke((MethodInvoker)(() => progressBar1.Value = position)); // .Net ругает, возможно из-за WPF
}
}
}
catch (Exception) { }
Согласен, очень косячный код, впервые сталкиваюсь с таким огромным фронтом работы, тем не менее, средствами поисковых систем, навыков чтения документации, что-то удалось вывести.
И еще момент, нужно чтобы скачивались файлы в том случае, если их версия новее версии, которая лежит у пользователя на ПК. Я пытался сделать через File.Version, по-моему так, но в FTP не прокатывало, она все равно продолжала записывать все файлы на пользовательскую машину. А нужно конкретно те, которые новее или же, если некоторые файлы отсутствует - докачать их.