Cómo crear una función FileCompare mediante Visual C++ .NET o Visual C++ 2005

Seleccione idioma Seleccione idioma
Id. de artículo: 816189 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

En este artículo paso a paso describe cómo comparar dos archivos para ver si su contenido es los mismos. Esta comparación se parece el contenido de los dos archivos, pero no en los nombres de archivo, ubicaciones, fechas, horas o otros atributos.

Esta funcionalidad es similar a la Fc.exe MS-DOS utilidad que se incluye con varias versiones de Microsoft Windows y MS-DOS y con algunas herramientas de desarrollo.

El código de ejemplo que se describe en este artículo realiza una comparación de byte a byte hasta que se encuentra un error de coincidencia o hasta que se alcanza el final del archivo. El código también realiza las siguientes dos comprobaciones simples para aumentar la eficacia de la comparación:
  • Si ambos archivos punto referencias al mismo archivo, deben ser iguales los dos archivos.
  • Si el tamaño de los dos archivos diferente, los dos archivos son diferentes.

Crear el ejemplo

  1. Inicie Visual Studio .NET (2003) o Microsoft Visual Studio 2005.
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. Haga clic en Proyectos de Visual C++ en Tipos de proyecto y, a continuación, haga clic en Proyecto vacío (. NET) en plantillas . Proyecto el nombre FileCompare .

    Nota En Visual Studio 2005, haga clic en Visual C++ en Tipos de proyecto y, a continuación, haga clic en Proyecto vacío en plantillas .
  4. En el Explorador de soluciones, haga clic con el botón secundario del mouse en FileCompare , elija Agregar y, a continuación, haga clic en Agregar nuevo elemento .
  5. En el cuadro de diálogo Agregar nuevo elemento , haga clic en Archivo de encabezado , bajo plantillas . En el cuadro de texto nombre , escriba Form1 y a continuación, haga clic en Abrir . Se muestra el archivo Form1.h.
  6. Paste the following code in the Form1.h file:
    #pragma once
    #using <mscorlib.dll>
    #using <system.windows.forms.dll>
    #using <system.dll>
    #using <system.drawing.dll>
    
    namespace Compare
    {
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Drawing;
    	using namespace System::IO;
    
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    		}
      
    	protected:
    		void Dispose(Boolean disposing)
    		{
    			if (disposing && components)
    			{
    				components->Dispose();
    			}
    			__super::Dispose(disposing);
    		}
    	
    	private: System::Windows::Forms::TextBox *  textBox1;
    	private: System::Windows::Forms::TextBox *  textBox2;
    	private: System::Windows::Forms::Label *  label1;
    	private: System::Windows::Forms::Label *  label2;
    	private: System::Windows::Forms::Button *  Compare;
    
    
    	private:
    
    		System::ComponentModel::Container * components;
    
    		
    		void InitializeComponent(void)
    		{
    			this->textBox1 = new System::Windows::Forms::TextBox();
    			this->textBox2 = new System::Windows::Forms::TextBox();
    			this->label1 = new System::Windows::Forms::Label();
    			this->label2 = new System::Windows::Forms::Label();
    			this->Compare = new System::Windows::Forms::Button();
    			this->SuspendLayout();
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(32, 104);
    			this->textBox1->Name = S"textBox1";
    			this->textBox1->TabIndex = 0;
    			this->textBox1->Text = S"";
    			// 
    			// textBox2
    			// 
    			this->textBox2->Location = System::Drawing::Point(168, 104);
    			this->textBox2->Name = S"textBox2";
    			this->textBox2->TabIndex = 1;
    			this->textBox2->Text = S"";
    			// 
    			// label1
    			// 
    			this->label1->Location = System::Drawing::Point(32, 64);
    			this->label1->Name = S"label1";
    			this->label1->TabIndex = 2;
    			this->label1->Text = S"File1";
    			// 
    			// label2
    			// 
    			this->label2->Location = System::Drawing::Point(176, 64);
    			this->label2->Name = S"label2";
    			this->label2->TabIndex = 3;
    			this->label2->Text = S"File2";
    			// 
    			// Compare
    			// 
    			this->Compare->Location = System::Drawing::Point(96, 168);
    			this->Compare->Name = S"Compare";
    			this->Compare->TabIndex = 4;
    			this->Compare->Text = S"Compare";
    			this->Compare->Click += new System::EventHandler(this, button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
    			this->ClientSize = System::Drawing::Size(292, 273);
    			this->Controls->Add(this->Compare);
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->label1);
    			this->Controls->Add(this->textBox2);
    			this->Controls->Add(this->textBox1);
    			this->Name = S"Form1";
    			this->Text = S"Form1";
    			this->ResumeLayout(false);
    
    		}
    	private:
    		System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    		{	 
    		}
    
    	};
    }
    este código crea un formulario que contiene dos controles de cuadro de texto y un botón de comando.

    Nota Debe agregar la opción de compilador de common language runtime soporte (/ CLR: oldSyntax) en Visual C++ 2005 para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador de common language runtime compatibilidad en Visual C++ 2005, siga estos pasos:
    1. Haga clic en proyecto y, a continuación, haga clic en <ProjectName> propiedades .

      Nota <ProjectName> es un marcador de posición para el nombre del proyecto.
    2. Expanda Propiedades de configuración y, a continuación, haga clic en General .
    3. Haga clic para seleccionar compatible con Common Language Runtime, sintaxis antigua (/ CLR: oldSyntax) en la configuración de proyecto compatibilidad con Common Language Runtime en el panel derecho, haga clic en Aplicar y, a continuación, haga clic en Aceptar .
    Para obtener más información acerca de common language runtime admite (opción del compilador), visite el siguiente sitio Web de Microsoft:
    / clr (Common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Agregue la siguiente función a la clase Form1 :
    // This method accepts two strings that represent two files to 
    // compare. A return value of 0 indicates that the contents of the files
    // are the same. A return value of any other value indicates that the 
    // files are different.
    private:
    bool FileCompare(String *file1, String *file2)
    {
    	int file1byte;
    	int file2byte;
    	FileStream *fs1;
    	FileStream *fs2;
        
    	// Determine if the same file was referenced two times.
    	if (String::Equals(file1,file2))
    	{
    		// Return true to indicate that the files are the same.
    		return true;
    	}
    
            
    	// Open the two files.
    	try
    	{
    		fs1 = new FileStream(file1, FileMode::Open);
    		fs2 = new FileStream(file2, FileMode::Open);
    	
    			    
    		// Check the file sizes. If the sizes are different, the files 
    		// are different.
    		if (fs1->Length != fs2->Length)
    		{
    			// Close the file
    			fs1->Close();
    			fs2->Close();
    
    			// Return false to indicate files are different
    			return false;
    		}
    
    		// Read and compare a byte from each file until either a
    		// non-matching set of bytes is found or until the end of
    		// file1 is reached.
    		do 
    		{
    			// Read one byte from each file.
    			file1byte = fs1->ReadByte();
    			file2byte = fs2->ReadByte();
    		}
    		while ((file1byte == file2byte) && (file1byte != -1));
    
    		// Close the files.
    		fs1->Close();
    		fs2->Close();
    	}
    	
    	catch(Exception *ex)
    	{
    		if(fs1)
    		{
    			fs1->Close();
    		}
    		if(fs2)
    		{
    			fs2->Close();
    		}
    		throw ex;
    	}
    
    	// Return the success of the comparison. "file1byte" is 
    	// equal to "file2byte" at this point only if the files are 
    	// the same.
    	return ((file1byte - file2byte) == 0);
    }
    
    
  8. Pegue el código siguiente en el evento Click del botón de comando Button1_Click en la clase Form1 :
    try
    {
    	if (FileCompare(this->textBox1->Text, this->textBox2->Text))
    	{
    		MessageBox::Show("Files are equal.");				
    	}
    	else
    	{
    		MessageBox::Show("Files are not equal.");
    	}
    }
    catch(Exception *ex)
    {
    	MessageBox::Show(ex->Message);
    }
    
  9. En el Explorador de soluciones, haga clic con el botón secundario del mouse en FileCompare , elija Agregar y, a continuación, haga clic en Agregar nuevo elemento .
  10. En el cuadro de diálogo Agregar nuevo elemento , haga clic en Archivo C++ bajo plantillas . En el cuadro de texto nombre , escriba File_Compare y a continuación, haga clic en Abrir . Se muestra el archivo File_Compare.cpp.
  11. Pegue el código siguiente en el file:
    #include "form1.h"
    
    #include <windows.h>
    #include <tchar.h>
    
    using namespace Compare;
  12. Agregue la siguiente función WinMain al archivo File_Compare.cpp:
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    }
  13. Pegue el código siguiente en la función WinMain :
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. Guardar en el ejemplo.

Ejecutar el ejemplo

  1. Proporcionar rutas de acceso completos a dos archivos en los controles cuadro de texto.
  2. Haga clic en comparar .

Referencias

Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
Espacios de nombres System.IO
Acceso a archivos mediante la clase FileStream

Propiedades

Id. de artículo: 816189 - Última revisión: lunes, 26 de noviembre de 2007 - Versión: 2.3
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft Visual C++ .NET 2002 Standard
Palabras clave: 
kbmt kbhowtomaster kbhowto kbio KB816189 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 816189

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com