Vous êtes actuellement hors ligne, en attente de reconnexion à Internet.

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

Ancien nº de publication de cet article : F307398
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.

Retour au début

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);	}}
Retour au début

É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);
Retour au début

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()) );
Retour au début

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]);  } 
Retour au début

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]);}
Retour au début

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.

Retour au début

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 Windowsusing 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 Windowspublic:	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.
Retour au début
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 : Visitez le centre de support technique de Visual C++ .NET à l'adresse suivante :
Propriétés

ID d'article : 307398 - Dernière mise à jour : 10/13/2003 13:05:00 - Révision : 1.0

Microsoft Visual C++ .NET 2002 Initiation

  • kbhowto kbhowtomaster kbnewsgrouplink KB307398
Commentaires
y>