Effectuer des E/S de fichier de base dans Visual C++
Cet article explique comment effectuer des opérations d’entrée/sortie de fichier de base dans Microsoft Visual C++ ou dans Visual C++ .NET.
Version du produit d’origine : Visual C++
Numéro de base de connaissances d’origine : 307398
Résumé
Si vous débutez avec .NET Framework, vous constaterez que le modèle objet pour les opérations de fichier dans le .NET Framework est similaire à celui FileSystemObject
qui est populaire avec de nombreux développeurs Visual Studio.
Pour faciliter la transition, consultez Comment utiliser FileSystemObject avec Visual Basic.
Pour obtenir une version visual C# .NET de cet article, consultez Comment effectuer des E/S de fichier de base dans Visual C#.
Cet article fait référence aux espaces de noms de bibliothèque de classes .NET Framework suivants :
System::ComponentModel
System::Windows::Forms
System::Drawing
Vous pouvez toujours utiliser FileSystemObject
le .NET Framework. Comme il FileSystemObject
s’agit d’un composant COM (Component Object Model), .NET Framework nécessite que l’accès à l’objet soit via la couche interopérabilité. .NET Framework génère un wrapper pour le composant pour vous si vous souhaitez l’utiliser. Toutefois, la File
classe, la FileInfo
classe, les Directory
DirectoryInfo
classes et d’autres classes associées dans le .NET Framework, offrent des fonctionnalités qui ne sont pas disponibles avec le FileSystemObject
, sans la surcharge de la couche interopérabilité.
Opérations d’E/S de fichier illustrées
Les exemples de cet article décrivent les opérations d’E/S de fichier de base. La section Exemple pas à pas décrit comment créer un exemple de programme qui illustre les six opérations d’E/S de fichier suivantes :
- Lire un fichier texte
- Écrire un fichier texte
- Afficher les informations de fichier
- Répertorier les lecteurs de disque
- Répertorier les sous-dossiers
- Répertorier des fichiers
Lire un fichier texte
L’exemple de code suivant utilise une StreamReader
classe pour lire un fichier texte. Le contenu du fichier est ajouté à un contrôle ListBox. Le try...catch
bloc est utilisé pour alerter le programme si le fichier est vide. Il existe de nombreuses façons de déterminer quand la fin du fichier est atteinte ; cet exemple utilise la Peek
méthode 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);
}
Dans Visual C++, vous devez ajouter l’option de compilateur de prise en charge du Common Language Runtime (/clr :oldSyntax) pour compiler correctement l’exemple de code précédent en tant que C++managé. Pour ajouter l’option de compilateur de prise en charge du Common Language Runtime, procédez comme suit :
Cliquez sur Project, puis sur <Propriétés ProjectName>.
Note
<ProjectName> est un espace réservé pour le nom du projet.
Développez Propriétés de configuration, puis cliquez sur Général.
Dans le volet droit, cliquez pour sélectionner la prise en charge du Common Language Runtime, ancienne syntaxe (/clr :oldSyntax) dans les paramètres du projet de prise en charge du Common Language Runtime.
Cliquez sur Appliquer, puis sur OK.
Écrire un fichier texte
Cet exemple de code utilise une StreamWriter
classe pour créer et écrire dans un fichier. Si vous avez un fichier existant, vous pouvez l’ouvrir de la même façon.
StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt");
pwriter->WriteLine(S"File created using StreamWriter class.");
pwriter->Close();
listBox1->Items->Clear();
String *filew = new String(S"File Written to C:\\KBTest.txt");
listBox1->Items->Add(filew);
Afficher les informations de fichier
Cet exemple de code utilise une FileInfo
classe pour accéder aux propriétés d’un fichier. Notepad.exe est utilisé dans cet exemple. Les propriétés apparaissent 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"File Name = ", (pFileProps->get_FullName())));
listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime()).ToString()));
listBox1->Items->Add(String::Concat(S"Last Access Time = " ,(pFileProps->get_LastAccessTime()).ToString()));
listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime()).ToString()));
listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length()).ToString()));
Répertorier les lecteurs de disque
Cet exemple de code utilise les classes et Drive
les Directory
classes pour répertorier les lecteurs logiques sur un système. Pour cet exemple, les résultats s’affichent 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]);
}
Répertorier les sous-dossiers
Cet exemple de code utilise la GetDirectories
méthode de la Directory
classe pour obtenir une liste de 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]);
}
Répertorier des fichiers
Cet exemple de code utilise la GetFiles
méthode de la Directory
classe pour obtenir une liste de 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 choses peuvent se tromper lorsqu’un utilisateur obtient l’accès aux fichiers. Les fichiers peuvent ne pas exister, les fichiers peuvent être utilisés ou les utilisateurs peuvent ne pas avoir de droits sur les fichiers des dossiers auxquels ils tentent d’accéder. Tenez compte de ces possibilités lorsque vous écrivez du code pour gérer les exceptions qui peuvent être générées.
Exemple étape par étape
Démarrez Visual Studio .NET.
Dans le menu Fichier , pointez sur Nouveau, puis cliquez sur Projet.
Sous Types de projets, cliquez sur Projets Visual C++. Dans la section Modèles, cliquez sur Application Windows Forms (.NET).
Tapez KB307398 dans la zone Nom , tapez
C:\
la zone Emplacement , puis cliquez sur OK.Ouvrez le formulaire Form1 en mode Création, puis appuyez sur F4 pour ouvrir la fenêtre Propriétés .
Dans la fenêtre Propriétés , développez le dossier Taille . Dans la zone Largeur , tapez 700. Dans la zone Hauteur , tapez 320.
Ajoutez un contrôle ListBox et six contrôles Button à Form1.
Note
Pour afficher la boîte à outils, cliquez sur Boîte à outils dans le menu Affichage .
Dans la fenêtre Propriétés, modifiez l’emplacement, le nom, la taille, l’index TabIndex et les propriétés Texte de ces contrôles comme suit :
ID du contrôle Emplacement Nom Taille TabIndex Text button1 500, 32 button1 112, 23 1 Lire le fichier texte button2 500, 64 button2 112, 23 2 Écrire un fichier texte button3 500, 96 button3 112, 23 3 Afficher les informations sur le fichier button4 500, 128 button4 112, 23 4 Répertorier les lecteurs button5 500, 160 button5 112, 23 5 Répertorier les sous-dossiers button6 500, 192 button6 112, 23 6 Lister les fichiers listBox1 24, 24 listBox1 450, 200 0 listBox1 Ouvrez le fichier Form1.h . Dans la déclaration de
Form1
classe, déclarez une variable privéeString
avec le code suivant :private: String *windir;
Dans le constructeur de
Form1
classe, ajoutez le code suivant :windir = System::Environment::GetEnvironmentVariable("windir");
Pour effectuer des opérations de sortie d’entrée de fichier, ajoutez l’espace
System::IO
de noms.Appuyez sur Maj+F7 pour ouvrir Form1 en mode Création. Double-cliquez sur le bouton Lire le fichier texte, puis collez le code suivant :
// How to read a text file: // Use try...catch to deal with a 0 byte file or a non-existant file. 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(FileNotFoundException *ex) { listBox1->Items->Add(ex); } catch (System::Exception *e) { listBox1->Items->Add(e); }
Dans la vue Création Form1, double-cliquez sur le bouton Écrire un fichier texte, puis collez le code suivant :
// This demonstrates how to create and to write to a text file. StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt"); pwriter->WriteLine(S"The file was created by using the StreamWriter class."); pwriter->Close(); listBox1->Items->Clear(); String *filew = new String(S"File written to C:\\KBTest.txt"); listBox1->Items->Add(filew);
Dans la vue Création Form1, double-cliquez sur le bouton Afficher les informations de fichier, puis collez le code suivant dans la méthode :
// This code retrieves file properties. The example uses Notepad.exe. listBox1->Items->Clear(); String* testfile = String::Concat(windir, (S"\\notepad.exe")); FileInfo *pFileProps =new FileInfo(testfile); listBox1->Items->Add(String::Concat(S"File Name = ", (pFileProps->get_FullName()))); listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime()).ToString())); listBox1->Items->Add(String::Concat(S"Last Access Time = " ,(pFileProps->get_LastAccessTime()).ToString())); listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime()).ToString())); listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length()).ToString()));
Dans la vue Création Form1, double-cliquez sur le bouton Lecteurs de liste, puis collez le code suivant :
// This demonstrates how to obtain a list of disk drives. listBox1->Items->Clear(); String* drives[] = Directory::GetLogicalDrives(); int numDrives = drives->get_Length(); for (int i=0; i<numDrives; i++) { listBox1->Items->Add(drives[i]); }
Dans la vue Création Form1, double-cliquez sur le bouton Sous-dossiers de liste, puis collez le code suivant :
// This code obtains a list of folders. This example uses the Windows folder. 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]); }
En mode Création Form1, double-cliquez sur le bouton Lister les fichiers, puis collez le code suivant :
// This code obtains a list of files. This example uses the Windows folder. 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]); }
Pour générer, puis exécuter le programme, appuyez sur Ctrl+F5.
Exemple de code complet
//Form1.h
#pragma once
namespace KB307398
{
using namespace System;
using namespace System::IO;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
/// </summary>
public __gc class Form1 : public System::Windows::Forms::Form
{
private:
String *windir;
public:
Form1(void)
{
windir = System::Environment::GetEnvironmentVariable("windir");
InitializeComponent();
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::Button * button1;
private: System::Windows::Forms::Button * button2;
private: System::Windows::Forms::Button * button3;
private: System::Windows::Forms::Button * button4;
private: System::Windows::Forms::Button * button5;
private: System::Windows::Forms::Button * button6;
private: System::Windows::Forms::ListBox * listBox1;
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container * components;
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->button1 = new System::Windows::Forms::Button();
this->button2 = new System::Windows::Forms::Button();
this->button3 = new System::Windows::Forms::Button();
this->button4 = new System::Windows::Forms::Button();
this->button5 = new System::Windows::Forms::Button();
this->button6 = new System::Windows::Forms::Button();
this->listBox1 = new System::Windows::Forms::ListBox();
this->SuspendLayout();
// button1
this->button1->Location = System::Drawing::Point(500, 32);
this->button1->Name = S"button1";
this->button1->Size = System::Drawing::Size(112, 23);
this->button1->TabIndex = 1;
this->button1->Text = S"Read Text File";
this->button1->Click += new System::EventHandler(this, button1_Click);
// button2
this->button2->Location = System::Drawing::Point(500, 64);
this->button2->Name = S"button2";
this->button2->Size = System::Drawing::Size(112, 23);
this->button2->TabIndex = 2;
this->button2->Text = S"Write Text File";
this->button2->Click += new System::EventHandler(this, button2_Click);
// button3
this->button3->Location = System::Drawing::Point(500, 96);
this->button3->Name = S"button3";
this->button3->Size = System::Drawing::Size(112, 23);
this->button3->TabIndex = 3;
this->button3->Text = S"View File Information";
this->button3->Click += new System::EventHandler(this, button3_Click);
// button4
this->button4->Location = System::Drawing::Point(500, 128);
this->button4->Name = S"button4";
this->button4->Size = System::Drawing::Size(112, 23);
this->button4->TabIndex = 4;
this->button4->Text = S"List Drives";
this->button4->Click += new System::EventHandler(this, button4_Click);
// button5
this->button5->Location = System::Drawing::Point(500, 160);
this->button5->Name = S"button5";
this->button5->Size = System::Drawing::Size(112, 23);
this->button5->TabIndex = 5;
this->button5->Text = S"List Subfolders";
this->button5->Click += new System::EventHandler(this, button5_Click);
// button6
this->button6->Location = System::Drawing::Point(500, 188);
this->button6->Name = S"button6";
this->button6->Size = System::Drawing::Size(112, 23);
this->button6->TabIndex = 6;
this->button6->Text = S"List Files";
this->button6->Click += new System::EventHandler(this, button6_Click);
// listBox1
this->listBox1->Location = System::Drawing::Point(24, 24);
this->listBox1->Name = S"listBox1";
this->listBox1->Size = System::Drawing::Size(450, 199);
this->listBox1->TabIndex = 0;
// Form1
this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
this->ClientSize = System::Drawing::Size(692, 293);
this->Controls->Add(this->listBox1);
this->Controls->Add(this->button6);
this->Controls->Add(this->button5);
this->Controls->Add(this->button4);
this->Controls->Add(this->button3);
this->Controls->Add(this->button2);
this->Controls->Add(this->button1);
this->Name = S"Form1";
this->Text = S"Form1";
this->ResumeLayout(false);
}
private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
// This code shows how to read a text file.
// The try...catch code is to deal with a 0 byte file or a non-existant file.
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(FileNotFoundException *ex)
{
listBox1->Items->Add(ex);
}
catch (System::Exception *e)
{
listBox1->Items->Add(e);
}
}
private: System::Void button2_Click(System::Object * sender, System::EventArgs * e)
{
// This code demonstrates how to create and to write to a text file.
StreamWriter* pwriter = new StreamWriter(S"c:\\KBTest.txt");
pwriter->WriteLine(S"The file was created by using the StreamWriter class.");
pwriter->Close();
listBox1->Items->Clear();
String *filew = new String(S"The file was written to C:\\KBTest.txt");
listBox1->Items->Add(filew);
}
private: System::Void button3_Click(System::Object * sender, System::EventArgs * e)
{
// This code retrieves file properties. This example uses Notepad.exe.
listBox1->Items->Clear();
String* testfile = String::Concat(windir, (S"\\notepad.exe"));
FileInfo *pFileProps =new FileInfo(testfile);
listBox1->Items->Add(String::Concat(S"File Name = ", (pFileProps->get_FullName() )) );
listBox1->Items->Add(String::Concat(S"Creation Time = ", (pFileProps->get_CreationTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Last Access Time = " ,(pFileProps->get_LastAccessTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Last Write Time = ", (pFileProps->get_LastWriteTime() ).ToString()) );
listBox1->Items->Add(String::Concat(S"Size = ", (pFileProps->get_Length() ).ToString()) );
}
private: System::Void button4_Click(System::Object * sender, System::EventArgs * e)
{
// The code demonstrates how to obtain a list of disk drives.
listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
listBox1->Items->Add(drives[i]);
}
}
private: System::Void button5_Click(System::Object * sender, System::EventArgs * e)
{
// This code obtains a list of folders. This example uses the Windows folder.
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]);
}
}
private: System::Void button6_Click(System::Object * sender, System::EventArgs * e)
{
// This code obtains a list of files. This example uses the Windows folder.
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]);
}
}
};
}
//Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>
using namespace KB307398;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
Application::Run(new Form1());
return 0;
}
References
Pour plus d’informations, visitez Support Microsoft. Pour plus d’informations sur la création de Windows Forms dans des extensions managées pour C++, consultez l’exemple dans l’aide ManagedCWinFormWiz
de Visual Studio .NET.