public void Iniciar(object sender, DoWorkEventArgs e) { TRABAJANDO = true; // Obtengo lista hash (ultimas modificaciones de LOTES en SQL) Hash.getFromSql(); OP.DownloadAll(); if (Hash.Database.Count() > 0) { try { // Recorro carpetas de ingenieria DirectoryInfo dir = new DirectoryInfo(@"\\USH-NT-3\v1\Users\INSAUT\PLANTA_3\TECNICOS_3\Programacion\LISTAS"); DirectoryInfo[] Folders = dir.GetDirectories(); int totalFolder = Folders.Count(); int countEstado = 0; progreso.Invoke((MethodInvoker)(() => progreso.Maximum = totalFolder)); // Recorro carpetas de modelos foreach (DirectoryInfo modelo in Folders) { OP.Procesar(modelo); // Aumento progreso. countEstado++; // Lista de lotes, solo extencion .txt FileInfo[] lotes = modelo.GetFiles("*.txt"); TreeNode idmodelo = null; treeLista.Invoke((MethodInvoker)(() => idmodelo = treeLista.Nodes.Add(modelo.Name))); // Recorro lotes del modelo actual foreach (FileInfo lote in lotes) { string loteNombre = lote.Name.Split('.')[0]; // Verifico fecha de modificacion. string lote_fecha_modificacion = lote.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); TreeNode idlote = null; treeLista.Invoke((MethodInvoker)(() => idlote = idmodelo.Nodes.Add(loteNombre))); // Verifico si existe el modelo y lote en la base de datos. Hash ModeloLote = Hash.Database.Find(o => o.modelo.Equals(modelo.Name) && o.lote.Equals(loteNombre) ); string loteHash = ""; if (ModeloLote == null) { // Si no existe en SQL.... // genero un HASH del lote actual (ultima fecha de modificacion) loteHash = Hash.generar(lote.FullName.ToString()); // Agrego a SQL string version = "1"; if (!loteHash.Equals("")) { addModeloLote(lote.FullName, modelo.Name, loteNombre, loteHash, lote_fecha_modificacion, version); } } else { // Verifico si existe en SQL el Modelo/lote int HashListIndex = Hash.Database.FindIndex(o => o.id == ModeloLote.id); if (HashListIndex >= 0) { // Agrego flag de existencia no solo en SQL sino en carpeta INGENIERIA Hash hash = Hash.Database[HashListIndex]; hash.existe = true; } if (!ModeloLote.fecha_modificacion.Equals(lote_fecha_modificacion)) { // Si la fecha de modificacion en SQL no es igual a la fecha de modificacion actual. // Por defecto se detecto una modificacion. string enuso = ""; string loteModificado = ""; try { // genero un HASH del lote actual loteHash = Hash.generar(lote.FullName.ToString()); } catch (Exception) { enuso = " EN USO "; } if (ModeloLote.hash.Equals(loteHash)) { // El hash es el mismo, no hay modificacion. loteModificado = "No"; // Actualizo ultima fecha de modificacion en SQL. IngenieriaSql.updateFecha(ModeloLote.id, lote_fecha_modificacion); dgvMain.Invoke((MethodInvoker)(() => dgvMain.Rows.Add(modelo.Name + " " + loteNombre, loteHash, ModeloLote.hash, loteModificado + " (fecha actualizada)" + enuso) )); } else { // En caso de que el HASH sea diferente loteModificado = "Si, actualizando..."; /* * NOTA: * Aca Deberia ELIMINAR la version anterior y guardar la nueva version.... * O podria enviar la version anterior a un LOG y guardar la nueva version.... * Hay que pensarlo... queda pendiente... */ // Elimino Modelo/Lote + Lote de ingenieria en cascada. // En la proxima ejecucion se agregara la version nueva. IngenieriaSql.del(ModeloLote.id); addModeloLote(lote.FullName, modelo.Name, loteNombre, loteHash, lote_fecha_modificacion, (int.Parse(ModeloLote.version) + 1).ToString()); idlote.BackColor = ColorTranslator.FromHtml("#FF0000"); idmodelo.BackColor = ColorTranslator.FromHtml("#FF0000"); dgvMain.Invoke((MethodInvoker)(() => dgvMain.Rows.Add(modelo.Name + " " + loteNombre, loteHash, ModeloLote.hash, loteModificado + enuso) )); } // EN IF HASH } // END IF FECHA_MODIFICACION } // ENF IF MODELO NULL } // END FOREACH LOTE bw.ReportProgress(countEstado); } // END FOREACH MODELO // Listo todos los modelos que NO se hallan listado en INGENIERIA pero si existen en SQL List <Hash> Removidos = Hash.Database.FindAll(o => o.existe == false); foreach (Hash removido in Removidos) { dgvMain.Invoke((MethodInvoker)(() => dgvMain.Rows.Add(removido.modelo + " " + removido.lote, "", removido.hash, "Removido de ingenieria " + removido.id) )); } } catch (Exception ex) { logBox.Invoke((MethodInvoker)(() => logBox.Items.Add(ex.Message))); } } else { logBox.Invoke((MethodInvoker)(() => logBox.Items.Add("No se encontraron resultados de HASH en SMTDatabase"))); } }