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 d’origine du produit : Visual C++
Numéro de la base de connaissances d’origine : 307398

Résumé

Si vous débutez avec le .NET Framework, vous constaterez que le modèle objet pour les opérations de fichiers dans le .NET Framework est similaire au FileSystemObject qui est populaire auprès de nombreux développeurs Visual Studio.

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 dans FileSystemObject .NET Framework. Étant donné que le FileSystemObject est un composant COM (Component Object Model), le .NET Framework exige que l’accès à l’objet passe par la couche interopérabilité. Le .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 DirectoryDirectoryInfo 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

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 C++managé. Pour ajouter l’option de compilateur de prise en charge du Common Language Runtime, procédez comme suit :

  1. Cliquez sur Projet, puis sur <Propriétés du nom du> projet.

    Remarque

    <ProjectName> est un espace réservé pour le nom du projet.

  2. Développez Propriétés de configuration, puis cliquez sur Général.

  3. Dans le volet droit, cliquez pour sélectionner Prise en charge du Common Language Runtime, Ancienne syntaxe (/clr :oldSyntax) dans les paramètres de projet de prise en charge du Common Language Runtime.

  4. Dans la zone Plan de numérotation (contexte téléphonique), cliquez sur Parcourir pour localiser le plan de numérotation de l’utilisateur.

É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 du 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 Directory classes et Drive 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 les 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 nombreux problèmes peuvent se présenter lorsqu’un utilisateur accède à des fichiers. Il se peut que les fichiers n’existent pas, qu’ils soient en cours d’utilisation ou que les utilisateurs ne disposent pas 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 pas à pas

  1. Démarrez Visual Studio .NET.

  2. On the File menu, point to New, and then click Project.

  3. Sous Types de projets, cliquez sur Projets Visual C++. Sous la section Modèles, cliquez sur Windows Forms Application (.NET).

  4. Tapez KB307398 dans la zone Nom , tapez C:\ dans la zone Emplacement , puis cliquez sur OK.

  5. Ouvrez le formulaire Form1 en mode Création, puis appuyez sur F4 pour ouvrir la fenêtre Propriétés .

  6. Dans la fenêtre Propriétés , développez le dossier Taille . Dans la zone Largeur , tapez 700. Dans la zone Hauteur , tapez 320.

  7. Ajoutez un contrôle ListBox et six contrôles Button à Form1.

    Remarque

    Pour afficher la boîte à outils, cliquez sur Boîte à outils dans le menu Affichage .

  8. Dans la fenêtre Propriétés , modifiez les propriétés Location, Name, Size, TabIndex et Text de ces contrôles comme suit :

    ID de contrôle Emplacement Nom Taille TabIndex Texte
    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 de 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
  9. Ouvrez le fichier Form1.h . Dans la déclaration de Form1 classe, déclarez une variable privée String avec le code suivant :

    private:
    String *windir;
    
  10. Dans le constructeur de Form1 classe, ajoutez le code suivant :

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Pour effectuer des opérations de sortie d’entrée de fichier, ajoutez l’espace de System::IO noms .

  12. 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);
    }
    
  13. En mode Form1 Création, 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);
    
  14. En mode Form1 Création, double-cliquez sur le bouton Afficher les informations sur le 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()));
    
  15. En mode Form1 Création, 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]);
    }
    
  16. En mode Form1 Création, double-cliquez sur le bouton Répertorier les sous-dossiers, 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]);
    }
    
  17. En mode Form1 Création, 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]);
    }
    
  18. Pour générer et 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, consultez 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.