Delen via


Basisbestands-I/O uitvoeren in Visual C++

In dit artikel wordt beschreven hoe u basisbewerkingen voor bestandsinvoer/uitvoer (I/O) uitvoert in Microsoft Visual C++ of in Visual C++ .NET.

Oorspronkelijke productversie: Visual C++
Oorspronkelijk KB-nummer: 307398

Samenvatting

Als u niet bekend bent met .NET Framework, zult u merken dat het objectmodel voor bestandsbewerkingen in .NET Framework vergelijkbaar is met het FileSystemObject objectmodel dat populair is bij veel Visual Studio-ontwikkelaars.

Dit artikel verwijst naar de volgende .NET Framework Class Library-naamruimten:

  • System::ComponentModel
  • System::Windows::Forms
  • System::Drawing

U kunt de FileSystemObject .NET Framework nog steeds gebruiken. Omdat het FileSystemObject een COM-onderdeel (Component Object Model) is, vereist .NET Framework dat toegang tot het object via de interop-laag wordt gebruikt. Het .NET Framework genereert een wrapper voor het onderdeel als u het wilt gebruiken. De File klasse, de FileInfo klasse, de Directoryklassen DirectoryInfo en andere gerelateerde klassen in .NET Framework bieden echter functionaliteit die niet beschikbaar is met de FileSystemObject, zonder de overhead van de Interop-laag.

Gedemonstreerde bestands-I/O-bewerkingen

In de voorbeelden in dit artikel worden basisbewerkingen voor I/O-bestanden beschreven. In de stapsgewijze voorbeeldsectie wordt beschreven hoe u een voorbeeldprogramma maakt waarin de volgende zes I/O-bewerkingen voor bestanden worden gedemonstreerd:

Een tekstbestand lezen

In de volgende voorbeeldcode wordt een StreamReader klasse gebruikt om een tekstbestand te lezen. De inhoud van het bestand wordt toegevoegd aan een besturingselement Keuzelijst. Het try...catch blok wordt gebruikt om het programma te waarschuwen als het bestand leeg is. Er zijn veel manieren om te bepalen wanneer het einde van het bestand is bereikt; in dit voorbeeld wordt de Peek methode gebruikt om de volgende regel te onderzoeken voordat u deze leest.

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);
}

In Visual C++moet u de common Language Runtime-ondersteuningscompilatoroptie (/clr:oldSyntax) toevoegen om het vorige codevoorbeeld te compileren als beheerde C++. Voer de volgende stappen uit om de common Language Runtime-ondersteuningscompilatoroptie toe te voegen:

  1. Klik op Project en klik vervolgens op <ProjectName> Properties.

    Notitie

    <ProjectName> is een tijdelijke aanduiding voor de naam van het project.

  2. Vouw configuratie-eigenschappen uit en klik vervolgens op Algemeen.

  3. Klik in het rechterdeelvenster om Common Language Runtime-ondersteuning, oude syntaxis (/clr:oldSyntax) te selecteren in de instellingen van het Common Language Runtime-ondersteuningsproject.

  4. Klik achtereenvolgens op Toepassen en op OK.

Een tekstbestand schrijven

In deze voorbeeldcode wordt een StreamWriter klasse gebruikt om een bestand te maken en te schrijven. Als u een bestaand bestand hebt, kunt u het op dezelfde manier openen.

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);

Bestandsgegevens weergeven

Deze voorbeeldcode maakt gebruik van een FileInfo klasse voor toegang tot de eigenschappen van een bestand. Notepad.exe wordt in dit voorbeeld gebruikt. De eigenschappen worden weergegeven in een besturingselement Keuzelijst.

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()));

Schijfstations vermelden

In deze voorbeeldcode worden de Directory en Drive klassen gebruikt om de logische stations op een systeem weer te geven. Voor dit voorbeeld worden de resultaten weergegeven in een besturingselement Keuzelijst.

listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
    listBox1->Items->Add(drives[i]);
}

Submappen weergeven

In deze voorbeeldcode wordt de GetDirectories methode van de Directory klasse gebruikt om een lijst met mappen op te halen.

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]);
}

Bestanden in een lijst weergeven

In deze voorbeeldcode wordt de GetFiles methode van de Directory klasse gebruikt om een lijst met bestanden op te halen.

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]);
}

Veel dingen kunnen fout gaan wanneer een gebruiker toegang krijgt tot bestanden. De bestanden bestaan mogelijk niet, de bestanden zijn mogelijk in gebruik of gebruikers hebben mogelijk geen rechten voor de bestanden met mappen waartoe ze toegang proberen te krijgen. Houd rekening met deze mogelijkheden wanneer u code schrijft om de uitzonderingen af te handelen die kunnen worden gegenereerd.

Stapsgewijs voorbeeld

  1. Start Visual Studio .NET.

  2. Wijs in het menu Bestand naar Nieuw en klik vervolgens op Project.

  3. Klik onder Projecttypen op Visual C++ Projecten. Klik in de sectie Sjablonen op Windows Forms-toepassing (.NET).

  4. Typ KB307398 in het vak Naam , typ C:\ het vak Locatie en klik op OK.

  5. Open het formulier Form1 in de ontwerpweergave en druk vervolgens op F4 om het venster Eigenschappen te openen.

  6. Vouw in het venster Eigenschappen de map Grootte uit. Typ 700 in het vak Breedte. Typ 320 in het vak Hoogte.

  7. Voeg één besturingselement Keuzelijst en zes knopbesturingselementen toe aan Form1.

    Notitie

    Als u de werkset wilt weergeven, klikt u op Werkset in het menu Beeld .

  8. Wijzig in het venster Eigenschappen de locatie, de naam, de grootte, de tabindex en de teksteigenschappen van deze besturingselementen als volgt:

    Id van besturingselement Locatie Naam Tekengrootte TabIndex Sms verzenden
    knop1 500, 32 knop1 112, 23 1 Tekstbestand lezen
    knop2 500, 64 knop2 112, 23 2 Tekstbestand schrijven
    knop3 500, 96 knop3 112, 23 3 Bestandsgegevens weergeven
    knop4 500, 128 knop4 112, 23 4 Stations vermelden
    knop5 500, 160 knop5 112, 23 5 Submappen weergeven
    knop6 500, 192 knop6 112, 23 6 Bestanden weergeven
    listBox1 24, 24 listBox1 450, 200 0 listBox1
  9. Open het bestand Form1.h . Declareer in de Form1 klassedeclaratie één privévariabele String met de volgende code:

    private:
    String *windir;
    
  10. Voeg in de Form1 klasseconstructor de volgende code toe:

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Als u uitvoerbewerkingen voor bestandsinvoer wilt uitvoeren, voegt u de System::IO naamruimte toe.

  12. Druk op Shift+F7 om Formulier1 te openen in de ontwerpweergave. Dubbelklik op de knop Tekstbestand lezen en plak de volgende code:

    // 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. Dubbelklik in de ontwerpweergave formulier1 op de knop Tekstbestand schrijven en plak de volgende code:

    // 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. Dubbelklik in de ontwerpweergave van Form1 op de knop Bestandsgegevens weergeven en plak de volgende code in de methode:

    // 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. Dubbelklik in de ontwerpweergave van Form1 op de knop Lijststations en plak de volgende code:

    // 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. Dubbelklik in de ontwerpweergave van Form1 op de knop Lijstsubmappen en plak de volgende code:

    // 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. Dubbelklik in de ontwerpweergave van Form1 op de knop Lijstbestanden en plak de volgende code:

    // 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. Druk op Ctrl+F5 om het programma te bouwen en uit te voeren.

Codevoorbeeld voltooien

//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;
}

Verwijzingen

Ga naar Microsoft Ondersteuning voor meer informatie. Zie het voorbeeld in de Help van Visual Studio .NET voor meer informatie over het ManagedCWinFormWiz maken van Windows-formulieren in beheerde extensies voor C++.