Comment créer une fonction FileCompare à l'aide de Visual C++ .NET ou de Visual C++ 2005

Traductions disponibles Traductions disponibles
Numéro d'article: 816189 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Cet article étape par étape explique comment comparer deux fichiers pour vérifier si leur contenu est identiques. Cette comparaison semble au contenu des deux fichiers, mais pas aux noms de fichiers, magasins, dates, heures ou autres attributs.

Cette fonction équivaut à la Fc.exe MS-DOS basé utilitaire qui est fourni avec différentes versions de Microsoft Windows et MS-DOS de Microsoft et des outils de développement.

Le code exemple décrit dans cet article effectue une comparaison octet par octet jusqu'à ce qu'une incompatibilité est trouvée ou jusqu'à ce que la fin du fichier soit atteinte. Le code effectue également les vérifications de simples deux suivantes pour augmenter l'efficacité de la comparaison :
  • Si les deux fichier de point de références au même fichier, les deux fichiers doivent être égales.
  • Si la taille de deux fichiers différente, les deux fichiers sont différents.

Créer l'exemple

  1. Démarrez Visual Studio .NET (2003) ou Microsoft Visual Studio 2005.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Cliquez sur projets Visual C++ sous types de projet , puis cliquez sur projet vides (.NET) sous modèles . Nommez le projet FileCompare .

    note Dans Visual Studio 2005, cliquez sur Visual C++ sous types de projet , puis cliquez sur projet vide sous modèles .
  4. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur FileCompare , pointez sur Ajouter et puis cliquez sur Ajouter un nouvel élément .
  5. Dans la boîte de dialogue Ajouter un nouvel élément , cliquez sur fichier d'en-tête sous modèles . Dans la zone de texte Nom , tapez Form1 et puis cliquez sur Ouvrir . Le fichier Form1.h s'affiche.
  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)
    		{	 
    		}
    
    	};
    }
    Ce code crée un formulaire qui contient deux contrôles de zone de texte et un bouton de commande.

    note Vous devez ajouter l'option compilateur du prise en charge de runtime commun langue (/ clr:oldSyntax) de Visual C++ 2005 pour compiler avec succès l'exemple de code précédent. Pour ajouter l'option langue exécution prise en charge compilateur courantes dans Visual C++ 2005, procédez comme suit :
    1. Cliquez sur le projet , puis cliquez sur <ProjectName>Propriétés.

      note <ProjectName>est un espace réservé pour le nom du projet.
    2. Développez les propriétés de configuration , puis cliquez sur général .
    3. Cliquez pour sélectionner Common Language Runtime Support, l'ancienne syntaxe (/ clr:oldSyntax) dans le paramètre projet prend en charge du Common Language Runtime dans le volet droit, cliquez sur Appliquer , puis cliquez sur OK .
    Pour plus d'informations sur le common language runtime prennent en charge option de compilateur, reportez-vous au site de Web Microsoft suivant adresse :
    /CLR (Common Language Runtime compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  7. Ajoutez la fonction suivante à la 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. Collez le code suivant de l'événement Click du Button1_Click bouton de commande dans la classe Form1 : essayez
    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. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur FileCompare , pointez sur Ajouter et puis cliquez sur Ajouter un nouvel élément .
  10. Dans la boîte de dialogue Ajouter un nouvel élément , cliquez sur fichier C++ sous modèles . Dans la zone de texte Nom , tapez File_Compare et puis cliquez sur Ouvrir . Le fichier File_Compare.cpp s'affiche.
  11. Collez le code suivant dans le file:
    #include "form1.h"
    
    #include <windows.h>
    #include <tchar.h>
    
    using namespace Compare;
  12. Ajoutez la fonction WinMain suivante au fichier File_Compare.cpp :
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    }
  13. Collez le code suivant dans la fonction WinMain :
    System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    Application::Run(new Form1());
    return 0;
  14. Enregistrer l'exemple.

Exécuter l'exemple

  1. Fournir les chemins de complets accès deux fichiers dans les contrôles de zone de texte.
  2. Cliquez sur Comparer .

Références

Pour plus d'informations, reportez-vous aux sites Microsoft Developer réseau MSDN (Web adresses suivantes :
Espace de noms System.IO
Accès de fichier dans la classe FileStream

Propriétés

Numéro d'article: 816189 - Dernière mise à jour: lundi 26 novembre 2007 - Version: 2.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Initiation
  • Microsoft Visual C++ .NET 2002 Initiation
Mots-clés : 
kbmt kbhowtomaster kbhowto kbio KB816189 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 816189
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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