Почему бы вам не сделать такую полезную вещь, как платную интернет-трансляцию вашей конференции за мелкий прайс? Разработчики, живущие не в default-city были бы весьма довольны, да и вам тоже, имхо, был бы неплохой профит.
У вас что за сервер? Ну т.е. где хранится файл этот version.xml? Я полагал, что у вас на IIS-е крутится какой-то сайт, где этот version.xml лежит. Если так, то сделать проверку версии файлов, лежащих на сервере (и их.контрольных сумм, кстати), лучше в коде сайта, который крутится в IIS-e. Но, если у вас, например, фтп, то лучше автоматизировать процесс выкладывания сайтов на фтп, в процессе которого этот version.xml будет генериться автоматом. С клиента вы версии файлов на сервере так не узнаете, конечно.
Да, есть еще архитектурный вопрос. Зачем вы разнесли обновление и рестарт программы в 2 разных модуля? Имхо, вполне можно было обойтись одним.
Первая простыня кода просто вопиёт о рефакторинге:
if (File.Exists(«settings.xml») && new FileInfo(«settings.xml»).Length == 0) { File.Delete(«settings.xml»); }
if (File.Exists(«Ionic.Zip.dll») && new FileInfo(«Ionic.Zip.dll»).Length == 0) { File.Delete(«Ionic.Zip.dll»); }
if (File.Exists(«restart.exe») && new FileInfo(«restart.exe»).Length == 0) { File.Delete(«restart.exe»); }
Вас дублирование одного и того же кода (не говоря уже о строковых литералах) не смущает? Одной ф-цией, в которую передаётся имя файла сделать это нельзя было?
var task1 = Task.Factory.StartNew(() => DownloadFile(«Ionic.Zip.dll», doc.GetElementsByTagName(«Ionic.Zip»)[0].InnerText, doc.GetElementsByTagName(«Ionic.Zip»)[0].Attributes[«checksumm»].InnerText));
var task2 = Task.Factory.StartNew(() => DownloadFile(«restart.exe», doc.GetElementsByTagName(«restart»)[0].InnerText, doc.GetElementsByTagName(«restart»)[0].Attributes[«checksumm»].InnerText));
var task6 = Task.Factory.StartNew(() => DownloadFile(«LanguagePack.dll», doc.GetElementsByTagName(«languagePack»)[0].InnerText, doc.GetElementsByTagName(«languagePack»)[0].Attributes[«checksumm»].InnerText));
Здесь то же самое, плюс можно порекомендовать юзать вместо XmlDocument-a XDocument.
update.Check(true, progressBar1);
Передача классу визуального компонента — это зло!
Да, кстати, зачем вы храните в своём файле version.xml на сервере версии сборок? Ведь эту информацию можно получить всё тем же методом FileVersionInfo.GetVersionInfo?
Попробуйте использовать string.Format, будет гораздо более читабельно.
if (File.Exists(filename) && summ != null && new FileInfo(filename).Length > 0)
using (FileStream fs = File.OpenRead(filename))
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length);
byte[] checkSumm = md5.ComputeHash(fileData);
return BitConverter.ToString(checkSumm) == summ.ToUpper()? true: false;
}
else
return false;
Этот код, лучше написать с условием типа OR и возвратом false в начале, что позволит избежать лишней вложенности (т.е. будет меньше скобок = лучше читаемость)
Стоит также отметить отсутствие комментариев в коде, их наличие могло сократить статью в разы (например, при описании параметров функции). А также рекомендуется почитать про обработку ошибок, а для лучшего определения места в коде, кстати, хорошо использовать ex.StackTrace.
Успехов.
CustomerLookup
finds customer by id
fails for duplicate customers
Прим. «CustomerLookup [поиск заказчика]: находит заказчика по ID, не находит повторяющихся заказчиков,..»)
Не «не находит», а падает (тест), если есть несколько одинаковых заказчиков.
Вот-вот. Бизнес есть бизнес. Надоело мне, например, как владельцу читать русофобские статеечки этой команды — самое время поменять для начала главреда. А уж то, что за ним все остальные потянулись, владельцу только на руку, имхо!
Сайт проекта
Версия под 2012/2013
Да, есть еще архитектурный вопрос. Зачем вы разнесли обновление и рестарт программы в 2 разных модуля? Имхо, вполне можно было обойтись одним.
if (File.Exists(«settings.xml») && new FileInfo(«settings.xml»).Length == 0) { File.Delete(«settings.xml»); }
if (File.Exists(«Ionic.Zip.dll») && new FileInfo(«Ionic.Zip.dll»).Length == 0) { File.Delete(«Ionic.Zip.dll»); }
if (File.Exists(«restart.exe») && new FileInfo(«restart.exe»).Length == 0) { File.Delete(«restart.exe»); }
Вас дублирование одного и того же кода (не говоря уже о строковых литералах) не смущает? Одной ф-цией, в которую передаётся имя файла сделать это нельзя было?
var task1 = Task.Factory.StartNew(() => DownloadFile(«Ionic.Zip.dll», doc.GetElementsByTagName(«Ionic.Zip»)[0].InnerText, doc.GetElementsByTagName(«Ionic.Zip»)[0].Attributes[«checksumm»].InnerText));
var task2 = Task.Factory.StartNew(() => DownloadFile(«restart.exe», doc.GetElementsByTagName(«restart»)[0].InnerText, doc.GetElementsByTagName(«restart»)[0].Attributes[«checksumm»].InnerText));
var task6 = Task.Factory.StartNew(() => DownloadFile(«LanguagePack.dll», doc.GetElementsByTagName(«languagePack»)[0].InnerText, doc.GetElementsByTagName(«languagePack»)[0].Attributes[«checksumm»].InnerText));
Здесь то же самое, плюс можно порекомендовать юзать вместо XmlDocument-a XDocument.
update.Check(true, progressBar1);
Передача классу визуального компонента — это зло!
Да, кстати, зачем вы храните в своём файле version.xml на сервере версии сборок? Ведь эту информацию можно получить всё тем же методом FileVersionInfo.GetVersionInfo?
debug.Save(«private void DownloadFile(string filename, string xmlVersion, string xmlChecksumm)», «Filename: » + filename + Environment.NewLine + «Localname: » + (localFile != null? localFile: «null») + Environment.NewLine + «URL: » + url, ex.Message);
Попробуйте использовать string.Format, будет гораздо более читабельно.
if (File.Exists(filename) && summ != null && new FileInfo(filename).Length > 0)
using (FileStream fs = File.OpenRead(filename))
{
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] fileData = new byte[fs.Length];
fs.Read(fileData, 0, (int)fs.Length);
byte[] checkSumm = md5.ComputeHash(fileData);
return BitConverter.ToString(checkSumm) == summ.ToUpper()? true: false;
}
else
return false;
Этот код, лучше написать с условием типа OR и возвратом false в начале, что позволит избежать лишней вложенности (т.е. будет меньше скобок = лучше читаемость)
Стоит также отметить отсутствие комментариев в коде, их наличие могло сократить статью в разы (например, при описании параметров функции). А также рекомендуется почитать про обработку ошибок, а для лучшего определения места в коде, кстати, хорошо использовать ex.StackTrace.
Успехов.
CustomerLookup
finds customer by id
fails for duplicate customers
Прим. «CustomerLookup [поиск заказчика]: находит заказчика по ID, не находит повторяющихся заказчиков,..»)
Не «не находит», а падает (тест), если есть несколько одинаковых заказчиков.
«эВфЕмизм»