Como criar uma função FileCompare utilizando o Visual C++ .NET ou Visual C++ 2005

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.

816189
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 320348.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 320346.
Este artigo refere-se para o seguinte Microsoft .NET Framework Class Library espaço de nomes:

System.IO

Sumário
Este artigo passo a passo descreve como comparar dois ficheiros para averiguar se o respectivo conteúdo é os mesmos. Esta comparação observa o conteúdo de dois ficheiros, mas não não nos nomes dos ficheiros, localizações, datas, horas ou outros atributos.

Esta funcionalidade é semelhante a Fc.exe baseados no MS DOS utilitário incluído com diversas versões do Microsoft Windows e MS-DOS da Microsoft e com algumas ferramentas de desenvolvimento.

O código de exemplo descrito neste artigo efectua uma comparação de byte a byte até é encontrado um erro de correspondência ou até é atingido o fim do ficheiro. O código também executa as seguintes verificações simples dois para aumentar a eficiência da comparação:
  • Se ambos ficheiro ponto referências para o mesmo ficheiro, os dois ficheiros tem de ser iguais.
  • Se o tamanho dos dois ficheiros diferente, os dois ficheiros são diferentes.

Criar o exemplo

  1. Inicie o Visual Studio .NET (2003) ou o Microsoft Visual Studio 2005.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em Projectos do Visual C++ em Project Types e clique em Projecto vazio (NET) em modelos . Nome do projecto FileCompare .

    Nota No Visual Studio 2005, clique em Visual C++ em Project Types e, em seguida, clique em Projecto vazio em modelos .
  4. No Solution Explorer, clique com o botão direito do rato FileCompare , aponte para Adicionar e, em seguida, clique em Adicionar novo item .
  5. Na caixa de diálogo Adicionar novo item , clique em Ficheiro de cabeçalho em modelos . Na caixa de texto nome , escreva Form1 e, em seguida, clique em Abrir . O ficheiro Form1.h é apresentado.
  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 cria um formulário que contém dois controlos de caixa de texto e um botão de comando.

    Nota Tem de adicionar a opção de compilador do suporte de tempo de execução idioma comum (/ clr:oldSyntax) no Visual C++ 2005 a compilação com êxito o anterior exemplo de código. Para adicionar a opção de compilador do suporte de tempo de execução idioma comum no Visual C++ 2005, siga estes passos:
    1. Clique em Project e, em seguida, clique em <ProjectName> propriedades .

      Nota <ProjectName> é um marcador de posição para o nome do projecto.
    2. Expanda Propriedades de configuração e, em seguida, clique em Geral .
    3. Clique para seleccionar Runtime do idioma comum suporte, sintaxe antigo (/ clr:oldSyntax) na definição de projecto Common Language Runtime suporte no painel da direita, clique em Aplicar e, em seguida, clique em OK .
    Para obter mais informações sobre o common language runtime suporte a opção do compilador, visite o seguinte Web site da Microsoft:
    / clr (Common Language Runtime compilação)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Adicione a seguinte função à classe 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. Cole o seguinte código no evento Click do botão de comando button1_Click na classe Form1 : tente
    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. No Solution Explorer, clique com o botão direito do rato FileCompare , aponte para Adicionar e, em seguida, clique em Adicionar novo item .
  10. Na caixa de diálogo Adicionar novo item , clique em Ficheiro C++ em modelos . Na caixa de texto nome , escreva File_Compare e, em seguida, clique em Abrir . O ficheiro File_Compare.cpp é apresentado.
  11. Cole o seguinte código no file:
    #include "form1.h"#include <windows.h>#include <tchar.h>using namespace Compare;
  12. Adicione a seguinte função WinMain ao ficheiro File_Compare.cpp:
    int APIENTRY _tWinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPTSTR    lpCmdLine,                     int       nCmdShow){}
  13. Cole o seguinte código na função WinMain :
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;Application::Run(new Form1());return 0;
  14. Guarde o exemplo.

Executar o exemplo

  1. Fornece caminhos completos para dois ficheiros nos controlos de caixa de texto.
  2. Clique em Comparar .
Referências
Para obter mais informações, visite os seguintes Web sites da Microsoft Developer Network (MSDN):
Espaço de nomes System.IO
Ficheiro acesso através de classe FileStream

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 816189 - Última Revisão: 01/17/2015 06:55:22 - Revisão: 2.3

  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • kbnosurvey kbarchive kbmt kbhowtomaster kbhowto kbio KB816189 KbMtpt
Esta informação foi útil?