2015-06-03 3 views
0

Я пытаюсь создать «файл-updater», который, когда программа открывается, обнаруживает, существует ли папка с именем «моды», соответствующие файлы и их размеры (в байтах) , На самом деле это работает! Но у меня есть ярлык, который сообщает, какой файл загружается, и он показывает только последнее сообщение «Actualizacion finalizada.Ya puedes jugar!» вместо «Descargando» + ArmorSts »,« Descargando »+ TreeCpt» и «blablabla». , как я могу сообщить с меткой, какой файл я загружаю прямо сейчас и какой файл обновляется? если кто-то должен видеть сообщения на английском языке, дайте мне знать.C# - Проверить, существует ли файл и загрузить

string ArmorSts = "[1.7.10]ArmorStatusHUD-client-1.28.jar"; 
string TreeCpt = "[1.7.10]Treecapitator-universal-2.0.4.jar"; 
string AdvSolar = "AdvancedSolarPanel-1.7.10-3.5.1.jar"; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    string path = @"C:\Users\" + System.Environment.UserName + "\\AppData\\Roaming\\.minecraft\\mods\\"; 
    if (!Directory.Exists(path)) /* Si no existe, entonces... */ 
    { 
     MessageBox.Show("La carpeta .minecraft (" + path + ") no se encuentra. Por favor instale minecraft.", 
     "Error al encontrar el directorio", 
     MessageBoxButtons.OK, 
     MessageBoxIcon.Exclamation); 
     /* Busquemos el directorio entonces... */ 
     DialogResult result = folderBrowserDialog1.ShowDialog(); 
     if (result == DialogResult.OK) 
     { 
      string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath); 
     } 
     /* si cancelamos entonces cerramos el programa */ 
     else 
     { 
      Application.Exit(); 
     } 
    } 
    /* Si la carpeta existe, entonces... */ 
    else { 
     /* Si el mod esta, entonces... */ 
     FileInfo mod_1 = new FileInfo(path + ArmorSts); 
     /* Checkeamos si pesa igual */ 
     if (File.Exists(path + ArmorSts) && mod_1.Length == 27281) 
     { 
      label1.Text = ArmorSts + " - Actualizado"; 
      goto Siguiente_1; 
     } 
     else 
     { 
      /* Si el mod no esta o pesa diferente, entonces */ 
      label1.Text = "Descargando " + ArmorSts; 
      /* Descargar en %appdata%/.minecraft/mods */ 
      WebClient webClient = new WebClient(); 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri("http://xipher.16mb.com/JallenCraft/Mods_Actualizados/" + ArmorSts), path + ArmorSts); 
      goto Siguiente_1; 
     } 
Siguiente_1 : 
     FileInfo mod_2 = new FileInfo(path + TreeCpt); 
     if (File.Exists(path + TreeCpt) && mod_2.Length == 94792) 
     { 
      label1.Text = TreeCpt + " - Actualizado"; 
      goto Siguiente_2; 
     } 
     else 
     { 
      label1.Text = "Descargando " + TreeCpt; 
      /* Descargar en %appdata%/.minecraft/mods */ 
      WebClient webClient = new WebClient(); 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri("http://xipher.16mb.com/JallenCraft/Mods_Actualizados/" + TreeCpt), path + TreeCpt); 
      goto Siguiente_2; 
     } 
Siguiente_2: 

     FileInfo mod_3 = new FileInfo(path + AdvSolar); 
     if (File.Exists(path + AdvSolar) && mod_3.Length == 305645) 
     { 
      label1.Text = AdvSolar + " - Actualizado"; 
      goto Siguiente_3; 
     } 
     else 
     { 
      label1.Text = "Descargando " + AdvSolar; 
      /* Descargar en %appdata%/.minecraft/mods */ 
      WebClient webClient = new WebClient(); 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri("http://xipher.16mb.com/JallenCraft/Mods_Actualizados/" + AdvSolar), path + AdvSolar); 
      goto Siguiente_3; 
     } 
/* 
     ... 
     ... and on and on and on ... 
     ... 
     */ 
Siguiente_23: 
     FileInfo mod_24 = new FileInfo(path + Witchery); 
     if (File.Exists(path + Witchery) && mod_24.Length == 7009956) 
     { 
      label1.Text = Witchery + " - Actualizado"; 
      Thread.Sleep(1000); 
      ActualizacionFinalizada(); 
     } 
     else 
     { 
      label1.Text = "Descargando " + Witchery; 
      /* Descargar en %appdata%/.minecraft/mods */ 
      WebClient webClient = new WebClient(); 
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
      webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
      webClient.DownloadFileAsync(new Uri("http://xipher.16mb.com/JallenCraft/Mods_Actualizados/" + Witchery), path + Witchery); 
      ActualizacionFinalizada(); 
     } 
} 


private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    colorProgressBar1.Value = e.ProgressPercentage; 
} 

private void Completed(object sender, AsyncCompletedEventArgs e) 
{ 
    Actualizando(); 
    label1.Text = "Actualizado"; 
} 

private void ActualizacionFinalizada() 
{ 
    Actualizando(); 
    label1.Text = "Actualizacion finalizada. Ya puedes jugar!"; 
} 

Я учусь C# независимо друг от друга, и я знаю, что это не правильный путь (повторять один и тот же код с небольшими изменениями), если есть лучший способ упростить этот код или с лучшей производительностью я буду очень благодарен!

+0

Вам нужно будет очистить код, например, удалить «goto' и использовать язык немного больше, прежде чем вы получите прямые ответы здесь на SO. Перейдите к обмену стека кода обзора, а затем вернитесь со своей конкретной проблемой. – Arran

+0

Вы можете прочитать о чистом коде. Есть несколько действительно хороших советов и рекомендаций по написанию кода поддерживаемого кода. Поскольку он стоит здесь, это не очень хороший вопрос для SO, потому что это не сводит к минимуму код проблемы. –

+0

Существует http://ccd.ralfw.domainfactory-kunde.de/die-tugenden/ немецкий сайт о чистом коде. Но большинство терминов - английский. Примечание: сайт был изменен, и, похоже, не все ссылки в конечном формате. Точкой входа является http://clean-code-developer.de/ –

ответ

1

Это относится к основному принципу WinForms. Существует один поток для обновления пользовательского интерфейса. Когда вы устанавливаете свойства элементов управления, которые меняют внешний вид, это вызывает событие Paint для запуска этого потока. Ваши изменения не будут видны, пока вы не вернете управление программой обратно в этот поток.

Что вы хотите сделать, чтобы устранить проблему, переместите большую часть вашего кода Form_Load в элемент управления BackgroundWorker. Этот элемент управления существует явно, чтобы обеспечить место для длительных методов, которые в противном случае блокировали бы поток пользовательского интерфейса.

также: goto? В самом деле?

Смежные вопросы