COMMENT FAIRE : Effectuer des E/S de base sur des fichiers dans Visual C++ .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 307398 - Voir les produits auxquels s'applique cet article
Ancien nº de publication de cet article : F307398
Agrandir tout | Réduire tout

Sommaire

Résumé

La procédure pas à pas présentée dans cet article illustre six opérations de base d'entrée/sortie (E/S) de fichier dans Visual C++ .NET. Si vous êtes novice par rapport à .NET, vous remarquerez que le modèle d'objet pour les opérations de fichier dans .NET est très similaire à l'objet FileSystemObject (FSO), qui est très populaire auprès des développeurs Visual Studio 6.0. Pour faciliter la transition, les fonctionnalités expliquées ici s'appuient sur l'article suivant de la Base de connaissances Microsoft :
186118 PROCÉDURE : Utiliser FileSystemObjet avec Visual Basic
Vous pouvez encore utiliser FileSystemObject dans .NET. Comme FileSystemObject est un composant COM (Component Object Model), .NET impose que l'accès à l'objet s'effectue par l'intermédiaire de la couche Interop. .NET génère un wrapper pour le composant que vous pouvez utiliser si vous le souhaitez. Toutefois, les classes File, FileInfo, Directory et DirectoryInfo, ainsi que les autres classes associées de .NET Framework, offrent des fonctionnalités qui ne sont pas disponibles avec FSO et n'utilisent pas le temps système requis par la couche Interop.

Les exemples de cet article illustrent des opérations de base d'E/S sur des fichiers. La section "Exemple de code pas à pas" explique comment créer un exemple d'application qui illustre ces opérations.

Lecture d'un fichier texte

Cet exemple de code utilise une classe StreamReader pour lire le fichier System.ini. Le contenu du fichier est ajouté à un contrôle ListBox. Le bloc try...catch permet d'alerter le programme si le fichier est vide. Il existe plusieurs façons de déterminer que la fin du fichier a été atteinte ; cet exemple utilise la méthode Peek pour examiner la ligne suivante avant de la lire.
  listbox1->Items->Clear();
   	try   
	{    
		String* textFile = String::Concat(windir,(S"\\mytest.txt")); 
	        StreamReader *reader=new  StreamReader(textFile);
		do
		{
		    listbox1->Items->Add(reader->ReadLine());
		}   
		while(reader->Peek() != -1);
	}      
         
	catch (System::Exception *e)
	{ 
		listbox1->Items->Add(e);
	}

}

Écriture d'un fichier texte

Cet exemple de code utilise une classe StreamWriter pour créer un fichier et écrire dedans. Si vous disposez déjà d'un fichier, vous pouvez l'ouvrir de la même manière.
StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt");
pwriter->WriteLine(S"Fichier créé en utilisant la classe StreamWriter.");
pwriter->Close();
listbox1->Items->Clear();
String *filew = new String(S"Fichier écrit dans C:\\KBTest.txt");
listbox1->Items->Add(filew);

Affichage des informations sur le fichier

Cet exemple de code utilise une classe FileInfo pour accéder aux propriétés d'un fichier. Notepad.exe est utilisé dans cet exemple. Les propriétés sont affichées dans un contrôle ListBox.
 listbox1->Items->Clear();
 String* testfile = String::Concat(windir, (S"\\notepad.exe")); 
 FileInfo *pFileProps  =new FileInfo(testfile);

 listbox1->Items->Add(String::Concat(S"Nom du fichier = ", (pFileProps->get_FullName() )) );
 listbox1->Items->Add(String::Concat(S"Date et heure de création = ", (pFileProps->get_CreationTime() ).ToString()) );
 listbox1->Items->Add(String::Concat(S"Dernier accès = "  ,(pFileProps->get_LastAccessTime() ).ToString()) );
 listbox1->Items->Add(String::Concat(S"Dernière opération d'écriture = ", (pFileProps->get_LastWriteTime() ).ToString()) );
 listbox1->Items->Add(String::Concat(S"Taille = ", (pFileProps->get_Length() ).ToString()) );

Liste des lecteurs de disque

Cet exemple de code utilise les classes Directory et Drive pour répertorier les lecteurs logiques présents dans un système. Dans cet exemple, les résultats apparaissent dans un contrôle ListBox.
  listbox1->Items->Clear();
  String* drives[] = Directory::GetLogicalDrives();
  int numDrives = drives->get_Length();
  for (int i=0; i<numDrives; i++)
  {
	listbox1->Items->Add(drives[i]);
  } 

Liste des dossiers

Cet exemple de code utilise la méthode GetDirectories de la classe Directory pour récupérer la liste des dossiers.
listbox1->Items->Clear();
String* dirs[] = Directory::GetDirectories(windir);
int numDirs = dirs->get_Length();
for (int i=0; i<numDirs; i++)
{
listbox1->Items->Add(dirs[i]);
}

Liste des fichiers

Cet exemple de code utilise la méthode GetFiles de la classe Directory pour récupérer la liste des fichiers.
listbox1->Items->Clear();
String* files[]= Directory::GetFiles(this->windir);
int numFiles = files->get_Length();
for (int i=0; i<numFiles; i++)
{
  listbox1->Items->Add(files[i]);
}
De nombreuses difficultés peuvent survenir lorsqu'un utilisateur accède à des fichiers. Les fichiers peuvent ne pas exister ou être en cours d'utilisation et les utilisateurs peuvent ne pas disposer des autorisations requises sur les fichiers des dossiers auxquels ils tentent d'accéder. Il est important de prendre en compte de telles éventualités lorsque vous écrivez du code et de traiter les exceptions susceptibles d'être générées.

Exemple de code pas à pas

  1. Créez une nouvelle application C++ gérée dans Visual C++ .NET.
  2. Ouvrez la fenêtre de code pour <nom du projet>.cpp.
  3. Supprimez tout le code.
  4. Collez le code suivant dans <nom du projet>.cpp :
    #using <mscorlib.dll>
    using namespace System;
    using namespace System::IO;
    
    // fichiers .dll requis pour les formulaires Windows
    #using "System.dll"
    #using "System.Windows.Forms.dll"
    #using "System.Drawing.dll"
    
    // espaces de noms requis pour les formulaires Windows
    using namespace System::ComponentModel;
    using namespace System::Windows::Forms;
    using namespace System::Drawing;
    
    __gc class WinForm: public Form 
    {
    private:
    		
    	Button	    *button1;
    	Button	    *button2;
    	Button	    *button3;
    	Button	    *button4;
    	Button	    *button5;
    	Button	    *button6;
    	String*     windir;
    	ListBox     *listbox1;
    	String	    *caption;	// Légende du formulaire Windows
    	int	    width;	// largeur du formulaire Windows
    	int	    height;	// hauteur du formulaire Windows
    
    public:
    	WinForm() 
    	{
    		// Définir la légende et la taille du formulaire Windows
    		caption = "Form1";
    		width = 360;
    		height = 273;
    		windir=System::Environment::GetEnvironmentVariable("windir");
    		InitForm();
    	}
    
    	void Dispose()
    	{
    	// Destruction du formulaire.  Effectuer ici tout le nettoyage nécessaire.
    
    		Form::Dispose();
    	}
    
    void InitForm()
    {
    		// Configurer ici les contrôles
    		// Paramètres de base du formulaire Windows
    	
    		SuspendLayout();
    
    		// button1
    		// 
                    button1 = new Button();
    		button1->Text = "button1";
    		button1->Name = "button1";
    		button1->Size = Drawing::Size(112, 23);
    		button1->TabIndex = 1;
    		button1->Location = Drawing::Point(216,32);
    		button1->Click += (new EventHandler(this,                                   &WinForm::button1_Click));
    		Controls->Add(button1);
    
    		// button2
    		// 
    		button2 = new Button();
    		button2->Text = "button2";
    		button2->Name = "button2";
    		button2->Size = Drawing::Size(112, 23);
    		button2->TabIndex = 2;
    		button2->Location = Drawing::Point(216,64);
    		button2->Click += (new EventHandler(this,                                   &WinForm::button2_Click));
    		Controls->Add(button2);
    		
    		// button3
    		// 
    		button3 = new Button();
    		button3->Text = "button3";
    		button3->Name = "button3";
    		button3->Size = Drawing::Size(112, 23);
    		button3->TabIndex = 3;
    		button3->Location = Drawing::Point(216,96);
    		button3->Click += (new EventHandler(this,                                   &WinForm::button3_Click));
    		Controls->Add(button3);
    
    		// listbox1
    		// 
    		listbox1 = new ListBox();
    		listbox1->Text = "Listbox1";
    		listbox1->Name = "Listbox1";
    		listbox1->Size = Drawing::Size(176, 199);
    		listbox1->TabIndex = 0;
    		listbox1->Location = Drawing::Point(24,24);
    		Controls->Add(listbox1);
    			
    		// 
    		// button4
    		// 
    		button4 = new Button();
    		button4->Text = "button4";
    		button4->Name = "button4";
    		button4->Size = Drawing::Size(112, 23);
    		button4->TabIndex = 4;
    		button4->Location = Drawing::Point(216,128);
    		button4->Click += (new EventHandler(this,                                    &WinForm::button4_Click));
    		Controls->Add(button4);
    
    		// button5
    		// 
    		button5 = new Button();
    		button5->Text = "button5";
    		button5->Name = "button5";
    		button5->Size = Drawing::Size(112, 23);
    		button5->TabIndex = 5;
    		button5->Location = Drawing::Point(216,160);
    		button5->Click += (new EventHandler(this,                                   &WinForm::button5_Click));
    		Controls->Add(button5);
    
    		// button6
    		// 
    		button6 = new Button();
    		button6->Text = "button6";
    		button6->Name = "button6";
    		button6->Size = Drawing::Size(112, 23);
    		button6->TabIndex = 6;
    		button6->Location = Drawing::Point(216,192);
    		button6->Click += (new EventHandler(this,                                   &WinForm::button6_Click));
    		Controls->Add(button6);
    
    		Text = caption;
    		Size = System::Drawing::Size(width, height);
    	
    		Name = "Form1";
    		Text = "Form1";
    		Load += new System::EventHandler(this, Form1_Load);
    		ResumeLayout(false);
    
    }
    
    void button6_Click(Object *sender, EventArgs *e)
    {
    //procédure pour récupérer la liste des fichiers (l'exemple utilise le dossier Windows)
    	listbox1->Items->Clear();
    	String* files[]= Directory::GetFiles(this->windir);
    	int numFiles = files->get_Length();
    	for (int i=0; i<numFiles; i++)
    	{
    	 listbox1->Items->Add(files[i]);
    	}
    }
    
    void button1_Click(Object *sender, EventArgs *e)
    {
    //procédure pour lire un fichier texte
    //utilisation du bloc "try...catch" pour traiter le cas d'un fichier de 0 octet ou inexistant
    	listbox1->Items->Clear();
       
    	try   
    	{    
    	    String* textFile = String::Concat(windir,                                             ("\\mytest.txt")); 
    	    StreamReader *reader=new  StreamReader(textFile);
    	    do
    	    {
    		listbox1->Items->Add(reader->ReadLine());
    	    }   
    	    while(reader->Peek() != -1);
    	}      
             
    	catch (System::Exception *e)
    	{ 
    	    listbox1->Items->Add(e);
    	}
    
    }
    
     void Form1_Load(Object *sender, EventArgs *e)
    {
    	button1->Text = "Lire un fichier texte";
    	button2->Text = "Écrire un fichier texte";
    	button3->Text = "Afficher des informations sur le fichier";
    	button4->Text = "Liste des lecteurs";
    	button5->Text = "Liste des sous-dossiers";
    	button6->Text = "Liste des fichiers";
    }
    
    void button5_Click(Object *sender, EventArgs *e)
    {         
    //procédure pour récupérer la liste des dossiers (l'exemple utilise le dossier Windows)
    	listbox1->Items->Clear();
    	String* dirs[] = Directory::GetDirectories(windir);
    	int numDirs = dirs->get_Length();
    	for (int i=0; i<numDirs; i++)
    	{
    		listbox1->Items->Add(dirs[i]);
                                                          
    	}
    }
    
    void button4_Click(Object *sender, EventArgs *e)
    {
    //procédure pour récupérer une liste de lecteurs de disques
    	listbox1->Items->Clear();
    	String* drives[] = Directory::GetLogicalDrives();
    	int numDrives = drives->get_Length();
    	for (int i=0; i<numDrives; i++)
    	{
    		listbox1->Items->Add(drives[i]);
    	}
    }
    
    void button3_Click(Object *sender, EventArgs *e)
    {   
    //procédure pour récupérer les propriétés d'un fichier (l'exemple utilise notepad.exe)
     listbox1->Items->Clear();
     String* testfile = String::Concat(windir, (S"\\notepad.exe")); 
     FileInfo *pFileProps  =new FileInfo(testfile);
    
     listbox1->Items->Add(String::Concat(S"Nom du fichier = ", (pFileProps->get_FullName() )) );
     listbox1->Items->Add(String::Concat(S"Date et heure de création = ", (pFileProps->get_CreationTime() ).ToString()) );
     listbox1->Items->Add(String::Concat(S"Dernier accès = "  ,(pFileProps->get_LastAccessTime() ).ToString()) );
     listbox1->Items->Add(String::Concat(S"Dernière opération d'écriture = ", (pFileProps->get_LastWriteTime() ).ToString()) );
     listbox1->Items->Add(String::Concat(S"Taille = ", (pFileProps->get_Length() ).ToString()) );
    }
          
    
    void button2_Click(Object *sender, EventArgs *e)
    {
    //procédure pour créer un fichier texte et écrire dedans
      StreamWriter* pwriter = new StreamWriter("c:\\KBTest.txt");
      pwriter->WriteLine("Fichier créé en utilisant la classe StreamWriter.");
      pwriter->Close();
      listbox1->Items->Clear();
      String *filew = new String(S"Fichier écrit dans C:\\KBTest.txt");
      listbox1->Items->Add(filew);
    }
    };
    
    
    void main()
    {
    	// Cette ligne crée une instance du formulaire Windows et 
    	// l'utilise comme fenêtre principale de l'application. 
    	Application::Run(new WinForm());
    }
  5. Cliquez avec le bouton droit sur le nom du projet dans l'Explorateur de solutions, puis cliquez sur Propriétés. Sélectionnez C/C++, puis cliquez sur En-têtes précompilés. Remplacez le paramètre Créer/Utiliser les en-têtes précompilés par Sans utiliser les en-têtes précompilés, puis enregistrez le projet.
  6. Appuyez sur la touche F5 pour générer et exécuter l'application. Cliquez sur les boutons pour observer les différentes actions.

Références

Pour plus d'informations sur la création de formulaires Windows dans des extensions gérées pour Visual C++, consultez l'exemple "ManagedCWinFormWiz" dans l'aide sur Visual Studio .NET.

Pour obtenir des informations plus générales sur Visual C++ .NET, consultez le groupe de discussion Usenet suivant :
Microsoft.public.dotnet.languages.vc
Visitez le centre de support technique de Visual C++ .NET à l'adresse suivante :
Centre de support de Visual C++ .NET (2002)

Propriétés

Numéro d'article: 307398 - Dernière mise à jour: lundi 13 octobre 2003 - Version: 1.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ .NET 2002 Initiation
Mots-clés : 
kbhowto kbhowtomaster kbnewsgrouplink KB307398
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