Ausführen einfacher Datei-E/A-Vorgänge in Visual C++

In diesem Artikel wird beschrieben, wie Sie grundlegende Dateieingabe-/Ausgabevorgänge (E/A) in Microsoft Visual C++ oder in Visual C++ .NET ausführen.

Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 307398

Zusammenfassung

Wenn Sie noch nicht mit dem .NET Framework vertraut sind, werden Sie feststellen, dass das Objektmodell für Dateivorgänge im .NET Framework dem ähnelt, das FileSystemObject bei vielen Visual Studio-Entwicklern beliebt ist.

Dieser Artikel bezieht sich auf die folgenden .NET Framework Klassenbibliotheksnamespaces:

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

Sie können weiterhin im FileSystemObject .NET Framework verwenden. Da es sich bei um FileSystemObject eine COM-Komponente (Component Object Model) handelt, erfordert die .NET Framework, dass der Zugriff auf das Objekt über die Interop-Ebene erfolgt. Die .NET Framework generiert einen Wrapper für die Komponente für Sie, wenn Sie ihn verwenden möchten. Die File -Klasse, die FileInfo -Klasse, die -Klasse, die Directory- DirectoryInfo Klasse und andere verwandte Klassen im .NET Framework bieten jedoch Funktionen, die FileSystemObjectmit nicht verfügbar sind, ohne den Mehraufwand der Interop-Ebene.

Veranschaulichte Datei-E/A-Vorgänge

In den Beispielen in diesem Artikel werden grundlegende Datei-E/A-Vorgänge beschrieben. Im Abschnitt Schritt-für-Schritt-Beispiel wird beschrieben, wie Sie ein Beispielprogramm erstellen, das die folgenden sechs Datei-E/A-Vorgänge veranschaulicht:

Lesen einer Textdatei

Im folgenden Beispielcode wird eine StreamReader -Klasse verwendet, um eine Textdatei zu lesen. Der Inhalt der Datei wird einem ListBox-Steuerelement hinzugefügt. Der try...catch -Block wird verwendet, um das Programm zu warnen, wenn die Datei leer ist. Es gibt viele Möglichkeiten, zu bestimmen, wann das Ende der Datei erreicht ist. In diesem Beispiel wird die Peek -Methode verwendet, um die nächste Zeile vor dem Lesen zu untersuchen.

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++ müssen Sie die Common Language Runtime-Unterstützungscompileroption (/clr:oldSyntax) hinzufügen, um das vorherige Codebeispiel erfolgreich als verwaltetes C++ zu kompilieren. Führen Sie die folgenden Schritte aus, um die Common Language Runtime-Unterstützungscompileroption hinzuzufügen:

  1. Klicken Sie auf Projekt und dann auf <ProjektName-Eigenschaften>.

    Hinweis

    <ProjectName> ist ein Platzhalter für den Namen des Projekts.

  2. Erweitern Sie Konfigurationseigenschaften, und klicken Sie dann auf Allgemein.

  3. Klicken Sie im rechten Bereich, um Common Language Runtime-Unterstützung, alte Syntax (/clr:oldSyntax) in den Common Language Runtime-Supportprojekteinstellungen auszuwählen.

  4. Klicken Sie im Feld Wähleinstellungen (Telefonkontext) auf Durchsuchen, um die Wähleinstellungen für den Benutzer zu suchen.

Schreiben einer Textdatei

In diesem Beispielcode wird eine StreamWriter -Klasse verwendet, um eine Datei zu erstellen und in diese zu schreiben. Wenn Sie über eine vorhandene Datei verfügen, können Sie sie auf die gleiche Weise öffnen.

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

Anzeigen von Dateiinformationen

In diesem Beispielcode wird eine FileInfo -Klasse verwendet, um auf die Eigenschaften einer Datei zuzugreifen. in diesem Beispiel wird Notepad.exe verwendet. Die Eigenschaften werden in einem ListBox-Steuerelement angezeigt.

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

Datenträgerlaufwerke auflisten

In diesem Beispielcode werden die Directory Klassen und Drive verwendet, um die logischen Laufwerke auf einem System aufzulisten. In diesem Beispiel werden die Ergebnisse in einem ListBox-Steuerelement angezeigt.

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

Unterordner auflisten

In diesem Beispielcode wird die GetDirectories -Methode der Directory -Klasse verwendet, um eine Liste von Ordnern abzurufen.

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

Dateien auflisten

In diesem Beispielcode wird die GetFiles -Methode der Directory -Klasse verwendet, um eine Liste von Dateien abzurufen.

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

Viele Dinge können schiefgehen, wenn ein Benutzer Zugriff auf Dateien erhält. Die Dateien sind möglicherweise nicht vorhanden, die Dateien werden möglicherweise verwendet, oder Benutzer haben keine Rechte für die Dateien von Ordnern, auf die sie zugreifen möchten. Berücksichtigen Sie diese Möglichkeiten, wenn Sie Code schreiben, um die ausnahmen zu behandeln, die generiert werden können.

Schritt-für-Schritt-Beispiel

  1. Starten Sie Visual Studio .NET.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  3. Klicken Sie unter Projekttypen auf Visual C++-Projekte. Klicken Sie im Abschnitt Vorlagen auf Windows Forms Anwendung (.NET).

  4. Geben Sie KB307398 in das Feld Name ein, geben Sie C:\ in das Feld Speicherort ein, und klicken Sie dann auf OK.

  5. Öffnen Sie das Formular Form1 in der Entwurfsansicht, und drücken Sie dann F4, um das Fenster Eigenschaften zu öffnen.

  6. Erweitern Sie im Fenster Eigenschaften den Ordner Größe . Geben Sie im Feld Breiteden Wert 700 ein. Geben Sie im Feld Höheden Wert 320 ein.

  7. Fügen Sie form1 ein ListBox-Steuerelement und sechs Button-Steuerelemente hinzu.

    Hinweis

    Klicken Sie zum Anzeigen der Toolbox im Menü Ansicht auf Toolbox.

  8. Ändern Sie im Eigenschaftenfenster die Eigenschaften Location, Name, Size, TabIndex und Text dieser Steuerelemente wie folgt:

    Steuerelement-ID Standort Name Größe TabIndex Text
    button1 500, 32 button1 112, 23 1 Textdatei lesen
    button2 500, 64 button2 112, 23 2 Textdatei schreiben
    button3 500, 96 button3 112, 23 3 Dateiinformationen anzeigen
    button4 500, 128 button4 112, 23 4 Laufwerke auflisten
    button5 500, 160 button5 112, 23 5 Unterordner auflisten
    button6 500, 192 button6 112, 23 6 Dateien auflisten
    listBox1 24, 24 listBox1 450, 200 0 listBox1
  9. Öffnen Sie die Datei Form1.h . Deklarieren Sie in der Form1 Klassendeklaration eine private String Variable mit dem folgenden Code:

    private:
    String *windir;
    
  10. Fügen Sie im Form1 Klassenkonstruktor den folgenden Code hinzu:

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Fügen Sie den System::IO Namespace hinzu, um Dateieingabeausgabevorgänge auszuführen.

  12. Drücken Sie UMSCHALT+F7, um Form1 in der Entwurfsansicht zu öffnen. Doppelklicken Sie auf die Schaltfläche Textdatei lesen , und fügen Sie dann den folgenden Code ein:

    // 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. Doppelklicken Sie in der Formular1-Entwurfsansicht auf die Schaltfläche Textdatei schreiben , und fügen Sie dann den folgenden Code ein:

    // 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. Doppelklicken Sie in der Formular1-Entwurfsansicht auf die Schaltfläche Dateiinformationen anzeigen , und fügen Sie dann den folgenden Code in die -Methode ein:

    // 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. Doppelklicken Sie in der Formular1-Entwurfsansicht auf die Schaltfläche Laufwerke auflisten, und fügen Sie dann den folgenden Code ein:

    // 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. Doppelklicken Sie in der Formular1-Entwurfsansicht auf die Schaltfläche Listenunterordner, und fügen Sie dann den folgenden Code ein:

    // 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. Doppelklicken Sie in der Formular1-Entwurfsansicht auf die Schaltfläche Listendateien, und fügen Sie dann den folgenden Code ein:

    // 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. Drücken Sie STRG+F5, um das Programm zu erstellen und dann auszuführen.

Vollständiges Codebeispiel

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

Weitere Informationen finden Sie unter Microsoft-Support. Weitere Informationen zum Erstellen von Windows Forms in verwalteten Erweiterungen für C++ finden Sie im Beispiel in der ManagedCWinFormWiz Visual Studio .NET-Hilfe.