コード例 #1
0
        /// <summary>
        /// Método encargado de realizar operación XOR entre dos ficheros.
        /// </summary>
        /// <param name="ficheroA"></param>
        /// <param name="ficheroB"></param>
        /// <returns></returns>
        public static bool XorEntre(string rutaFicheroA, string rutaFicheroB, string rutaSalida, EncodingComparacion encoding)
        {
            // Obtenemos las diferencias antes de realizar la UNION de los elementos.
            var rutaPrimerArchivo  = DiferenciaTemporal(rutaFicheroA, rutaFicheroB, rutaSalida, encoding);
            var rutaSegundoArchivo = DiferenciaTemporal(rutaFicheroB, rutaFicheroA, rutaSalida, encoding);

            // Obtenemos los nombres de los archivos para asignar un nombre coherente al archivo de salida.
            var nombreFicheroA = ArchivoHelper.ObtenerNombreSinEspacios(rutaFicheroA);
            var nombreFicheroB = ArchivoHelper.ObtenerNombreSinEspacios(rutaFicheroB);

            // Creamos una ruta de salida para unir nuestro archivo.
            rutaSalida = rutaSalida + $"\\{nombreFicheroA}_xor_{nombreFicheroB}.txt";

            // Corroboramos existencia del archivo.
            if (!File.Exists(rutaSalida))
            {
                using (var stream = File.Create(rutaSalida)) { }
            }

            // MERGE.
            using (Stream destino = File.OpenWrite(rutaSalida))
            {
                using (Stream streamA = File.OpenRead(rutaPrimerArchivo))
                {
                    streamA.CopyTo(destino);
                    streamA.Close();
                    File.Delete(rutaPrimerArchivo);
                }
                using (Stream streamB = File.OpenRead(rutaSegundoArchivo))
                {
                    streamB.CopyTo(destino);
                    streamB.Close();
                    File.Delete(rutaSegundoArchivo);
                }
            }

            // Ordenamos el archivo conformado.
            ArchivoHelper.Ordenar(rutaSalida, rutaSalida, x => x, encoding.ArchivoSalida, encoding.ArchivoSalida);

            // Pasamos Garbage collector.
            GC.Collect();

            return(true);
        }
コード例 #2
0
        /// <summary>
        /// Método encargado de realizar operación AND entre dos ficheros.
        /// </summary>
        /// <param name="ficheroA"></param>
        /// <param name="ficheroB"></param>
        /// <returns></returns>
        public static bool AndEntre(string rutaFicheroA, string rutaFicheroB, string rutaSalida, EncodingComparacion encoding)
        {
            // Definimos las rutas.
            var nombreFicheroA = Path.GetFileNameWithoutExtension(new FileInfo(rutaFicheroA).Name);
            var nombreFicheroB = Path.GetFileNameWithoutExtension(new FileInfo(rutaFicheroB).Name);

            // Formateamos la salida del archivo.
            rutaSalida = rutaSalida + $"\\{nombreFicheroA}_and_{nombreFicheroB}.txt";

            // Ordenamos utilizando como criterio de ordenamiento toda la línea.
            ArchivoHelper.Ordenar(rutaFicheroA, rutaFicheroA, x => x, encoding.PrimerArchivo, encoding.ArchivoSalida);
            ArchivoHelper.Ordenar(rutaFicheroB, rutaFicheroB, x => x, encoding.SegundoArchivo, encoding.ArchivoSalida);


            using (StreamWriter escritorAuxiliar = new StreamWriter(rutaSalida))
            {
                var lectorA = new StreamReader(rutaFicheroA, encoding.ArchivoSalida);
                var lectorB = new StreamReader(rutaFicheroB, encoding.ArchivoSalida);

                var lineaActualA = "";
                var lineaActualB = "";

                bool iterateA = true;
                bool iterateB = true;

                //Mientras no se haya llegado al final del fichero.
                while (!lectorA.EndOfStream)
                {
                    // Orquestamos la Iteración.
                    if (!lectorB.EndOfStream && iterateB)
                    {
                        lineaActualB = lectorB.ReadLine();
                        iterateB     = false;
                    }

                    if (!lectorA.EndOfStream && iterateA)
                    {
                        lineaActualA = lectorA.ReadLine();
                        iterateA     = false;
                    }

                    // Definicion del conjunto.
                    if (lineaActualA.CompareTo(lineaActualB) > 0)
                    {
                        iterateB = true;
                    }
                    else if (lineaActualA.CompareTo(lineaActualB) == 0)
                    {
                        iterateA = true;
                        iterateB = true;
                        escritorAuxiliar.WriteLine(lineaActualA);
                    }
                    else if (lineaActualA.CompareTo(lineaActualB) < 0)
                    {
                        iterateA = true;
                    }
                }

                lectorA.Dispose();
                lectorB.Dispose();
                GC.Collect();
            }
            return(true);
        }
コード例 #3
0
        /// <summary>
        /// Método encargado de comparar dos ficheros ordenados previamente.
        /// </summary>
        /// <param name="ficheroA"></param>
        /// <param name="ficheroB"></param>
        /// <returns></returns>
        public static string DiferenciaEntre(string rutaFicheroA, string rutaFicheroB, string rutaSalida, EncodingComparacion encoding)
        {
            // Obtenemos los nombres de los archivos para asignar un nombre coherente al archivo de salida.
            var nombreFicheroA = ArchivoHelper.ObtenerNombreSinEspacios(rutaFicheroA);
            var nombreFicheroB = ArchivoHelper.ObtenerNombreSinEspacios(rutaFicheroB);

            // Ordenamos utilizando como criterio de ordenamiento toda la línea.
            ArchivoHelper.Ordenar(rutaFicheroA, rutaFicheroA, x => x, encoding.PrimerArchivo, encoding.ArchivoSalida);
            ArchivoHelper.Ordenar(rutaFicheroB, rutaFicheroB, x => x, encoding.SegundoArchivo, encoding.ArchivoSalida);

            // Formateamos la salida del archivo.
            rutaSalida = rutaSalida + $"\\{nombreFicheroA}_diff_{nombreFicheroB}.txt";

            using (StreamWriter escritorAuxiliar = new StreamWriter(rutaSalida))
            {
                var lectorA = new StreamReader(rutaFicheroA);
                var lectorB = new StreamReader(rutaFicheroB);

                var lineaActualA = "";
                var lineaActualB = "";

                bool iterateA = true;
                bool iterateB = true;

                bool work = true;

                //Mientras no se haya llegado al final del fichero.
                while (work)
                {
                    // Orquestamos la Iteración.
                    if (!lectorB.EndOfStream && iterateB)
                    {
                        lineaActualB = lectorB.ReadLine();
                        iterateB     = false;
                    }

                    if (!lectorA.EndOfStream && iterateA)
                    {
                        lineaActualA = lectorA.ReadLine();
                        iterateA     = false;
                    }

                    // Definicion del conjunto.
                    if (lineaActualA.CompareTo(lineaActualB) > 0)
                    {
                        iterateB = true;

                        if (lectorB.EndOfStream)
                        {
                            work = false;
                            escritorAuxiliar.WriteLine(lineaActualA);
                        }
                    }
                    else if (lineaActualA.CompareTo(lineaActualB) == 0)
                    {
                        iterateA = true;
                        iterateB = true;

                        if (lectorA.EndOfStream)
                        {
                            work = false;
                        }
                    }
                    else if (lineaActualA.CompareTo(lineaActualB) < 0)
                    {
                        // El elemento pertenece unicamente al conjunto A.
                        iterateA = true;
                        escritorAuxiliar.WriteLine(lineaActualA);

                        if (lectorA.EndOfStream)
                        {
                            work = false;
                        }
                    }
                }
                lectorA.Dispose();
                lectorB.Dispose();
                GC.Collect();
            }
            return(rutaSalida);
        }
コード例 #4
0
        /// <summary>
        /// Método encargado de realizar una operacion según el tipo especificado.
        /// </summary>
        public string RealizarOperacion(string rutaFicheroA, string rutaFicheroB, string rutaSalida, TipoComparacion tipoComparacion)
        {
            string retorno;

            // Validacion ruta textbox tres.
            char caracter = (char)92;

            while (true)
            {
                if (rutaSalida.StartsWith(caracter.ToString()))
                {
                    rutaSalida = rutaSalida.Remove(0, 1);
                }
                else
                {
                    break;
                }
            }

            // Ordenamos utilizando como criterio de ordenamiento toda la línea.
            ArchivoHelper.Ordenar(rutaFicheroA, rutaFicheroA, x => x, encodingPrimerArchivo, encodingArchivoSalida);
            ArchivoHelper.Ordenar(rutaFicheroB, rutaFicheroB, x => x, encodingSegundoArchivo, encodingArchivoSalida);

            // Obtenemos los nombres de los archivos para asignar un nombre coherente al archivo de salida.
            var nombreFicheroB = ProcesoComparador.ObtenerNombreSinEspacios(rutaFicheroB);
            var nombreFicheroA = ProcesoComparador.ObtenerNombreSinEspacios(rutaFicheroA);

            // Formateamos la salida del archivo.
            if (!File.Exists(rutaSalida))
            {
                if (Directory.Exists(rutaSalida))
                {
                    rutaSalida = rutaSalida + $"\\{nombreFicheroA}_comp_{nombreFicheroB}.txt";
                }
                else
                {
                    using (File.Create(rutaSalida)) { }
                }
            }

            using (StreamWriter escritorSalida = new StreamWriter(rutaSalida, true, encodingArchivoSalida))
                using (StreamReader lectorB = new StreamReader(rutaFicheroB, encodingSegundoArchivo))
                    using (StreamReader lectorA = new StreamReader(rutaFicheroA, encodingPrimerArchivo))
                    {
                        switch (tipoComparacion)
                        {
                        case TipoComparacion.Diferencia:
                            retorno = DiferenciaEntre(escritorSalida, lectorA, lectorB);
                            break;

                        case TipoComparacion.XOR:
                            retorno = XorEntre(escritorSalida, lectorA, lectorB);
                            break;

                        case TipoComparacion.AND:
                            retorno = AndEntre(escritorSalida, lectorA, lectorB);
                            break;

                        default:
                            return(null);
                        }
                    }

            ArchivoHelper.Ordenar(rutaSalida, rutaSalida, x => x, encodingArchivoSalida, encodingArchivoSalida);
            return(retorno);
        }