Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie grundlegende Eingabe-/Ausgabevorgänge (File Input/Output, 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 mit .NET Framework noch nicht vertraut sind, stellen Sie fest, dass das Objektmodell für Dateivorgänge in .NET Framework dem ähnlich ist, der FileSystemObject bei vielen Visual Studio-Entwicklern beliebt ist.
Um den Übergang zu erleichtern, lesen Sie How To Use FileSystemObject with Visual Basic.
Eine Version dieses Artikels für Visual C# .NET finden Sie unter "So führen Sie grundlegende Datei-E/A in Visual C# durch.
Dieser Artikel bezieht sich auf die folgenden .NET Framework-Klassenbibliotheksnamespaces:
System::ComponentModelSystem::Windows::FormsSystem::Drawing
Sie können das .NET Framework weiterhin mit FileSystemObject verwenden. Da es FileSystemObject sich um eine COM-Komponente (Component Object Model) handelt, erfordert .NET Framework, dass der Zugriff auf das Objekt über die Interop-Ebene erfolgt. .NET Framework generiert einen Wrapper für die Komponente, wenn Sie sie verwenden möchten. Die File-Klasse, die FileInfo-, Directory- und DirectoryInfo-Klassen sowie andere verwandte Klassen im .NET Framework bieten jedoch Funktionen, die bei FileSystemObject nicht verfügbar sind und das ohne den Aufwand der Interop-Ebene.
Veranschaulichte Datei-E/A-Vorgänge
In den Beispielen in diesem Artikel werden grundlegende Datei-E/A-Vorgänge beschrieben. Im Schritt-für-Schritt-Beispielabschnitt wird beschrieben, wie Sie ein Beispielprogramm erstellen, das die folgenden sechs Datei-E/A-Vorgänge veranschaulicht:
- Lesen einer Textdatei
- Schreiben einer Textdatei
- Dateiinformationen anzeigen
- Datenträgerlaufwerke auflisten
- Unterordner auflisten
- Dateien auflisten
Lesen einer Textdatei
Im folgenden Beispielcode wird eine StreamReader Klasse zum Lesen einer Textdatei verwendet. Der Inhalt der Datei wird einem ListBox-Steuerelement hinzugefügt. Der try...catch Block wird verwendet, um das Programm zu benachrichtigen, 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 Compileroption für die Common Language Runtime-Unterstützung hinzuzufügen:
Klicken Sie auf "Projekt" und dann auf <"ProjectName-Eigenschaften> ".
Hinweis
<ProjectName> ist ein Platzhalter für den Namen des Projekts.
Erweitern Sie konfigurationseigenschaften, und klicken Sie dann auf "Allgemein".
Klicken Sie im rechten Bereich, um die Unterstützung von Common Language Runtime, Old Syntax (/clr:oldSyntax) in den Common Language Runtime-Supportprojekteinstellungen auszuwählen.
Klicken Sie auf Übernehmen und anschließend auf OK.
Schreiben einer Textdatei
Dieser Beispielcode verwendet eine StreamWriter Klasse zum Erstellen und Schreiben in eine Datei. 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);
Dateiinformationen anzeigen
Dieser Beispielcode verwendet eine FileInfo Klasse, um auf die Eigenschaften einer Datei zuzugreifen. Notepad.exe wird in diesem Beispiel 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()));
Laufwerke auflisten
In diesem Beispielcode werden die Klassen Directory und Drive verwendet, um die logischen Laufwerke eines Systems 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
Dieser Beispielcode verwendet die GetDirectories Methode der Directory Klasse, 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
Dieser Beispielcode verwendet die GetFiles Methode der Directory Klasse, um eine Auflistung 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 schief gehen, wenn ein Benutzer Zugriff auf Dateien erhält. Die Dateien sind möglicherweise nicht vorhanden, die Dateien werden 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
Starten Sie Visual Studio .NET.
Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.
Klicken Sie unter Projekttypen auf Visual C++-Projekte. Klicken Sie unter "Vorlagen " auf "Windows Forms-Anwendung (.NET)".
Geben Sie KB307398 im Feld "Name" ein, geben Sie
C:\im Feld "Speicherort" ein und klicken Sie dann auf OK.Öffnen Sie das Formular 1 in der Entwurfsansicht, und drücken Sie dann F4, um das Eigenschaftenfenster zu öffnen.
Erweitern Sie im Fenster "Eigenschaften " den Ordner "Größe ". Geben Sie im Feld "Breite " den Typ 700 ein. Geben Sie im Feld "Höhe" den Typ 320 ein.
Fügen Sie ein ListBox-Steuerelement und sechs Schaltflächensteuerelemente zu Form1 hinzu.
Hinweis
Klicken Sie zum Anzeigen der Toolbox im Menü "Ansicht" auf "Toolbox".
Ändern Sie im Eigenschaftenfenster den Speicherort, den Namen, die Größe, den TabIndex und die Texteigenschaften dieser Steuerelemente wie folgt:
Steuerungs-ID Ort Name Größe TabIndex Text Schaltfläche1 500, 32 Schaltfläche1 112, 23 1 Textdatei lesen button2 500, 64 button2 112, 23 2 Textdatei schreiben Schaltfläche3 500, 96 Schaltfläche3 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 Öffnen Sie die Datei "Form1.h ". Deklarieren Sie in der
Form1Klassendeklaration eine privateStringVariable mit dem folgenden Code:private: String *windir;Fügen Sie im
Form1Klassenkonstruktor den folgenden Code hinzu:windir = System::Environment::GetEnvironmentVariable("windir");Fügen Sie den
System::IONamespace hinzu, um Dateieingabeausgabevorgänge auszuführen.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); }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);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()));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]); }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]); }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]); }Zum Erstellen und Ausführen des Programms drücken Sie STRG+F5.
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;
}
Referenzen
Weitere Informationen finden Sie im Microsoft-Support. Weitere Informationen zum Erstellen von Windows-Formularen in verwalteten Erweiterungen für C++ finden Sie im Beispiel in der ManagedCWinFormWiz Visual Studio .NET-Hilfe.