Dieser Artikel erläutert Schritt für Schritt, wie Sie sechs allgemeine Datei-Eingabe/Ausgabe (I/O)-Vorgänge in Visual C++ .NET ausführen können. Wenn Sie noch nicht mit .NET vertraut sind, werden Sie feststellen, dass das Objektmodell für Dateivorgänge in .NET dem
FileSystemObject (FSO) sehr ähnelt, das bei Visual Studio 6.0-Entwicklern verbreitet ist. Um den Übergang zu Visual C++ .NET zu vereinfachen, wurde als Grundlage für die in diesem Artikel beschriebene Funktionalität der folgende Microsoft Knowledge Base-Artikel verwendet:
186118
(http://support.microsoft.com/kb/186118/DE/
)
HOWTO: Use FileSystemObject with Visual Basic
Sie können in .NET weiterhin
FileSystemObject verwenden. Da das
FileSystemObject eine COM-Komponente (Component Object Model, COM) ist, muss in .NET der Zugriff über die Interop-Schicht erfolgen. .NET erstellt einen Wrapper für die Komponente, wenn Sie sie zur Verwendung auswählen. Die Klassen
File,
FileInfo,
Directory und
DirectoryInfo sowie andere diesbezügliche Klassen im .NET-Framework bieten jedoch eine Funktionalität, die beim FSO-Objektmodell ohne den Verwaltungsaufwand der Interop-Schicht nicht verfügbar ist.
Die Beispiele in diesem Artikel beschreiben allgemeine Datei-I/O-Vorgänge. Im Abschnitt "Beispiel mit schrittweiser Anleitung" wird beschrieben, wie Sie eine Beispielanwendung erstellen können, die diese Vorgänge demonstriert:
Eine Textdatei lesen
In diesem Codebeispiel wird die Klasse
StreamReader zum Lesen der Datei System.ini verwendet. Der Inhalt der Datei wird zu einem
ListBox-Steuerelement hinzugefügt. Der Block
try...catch wird zum Warnen des Programms verwendet, wenn die Datei leer ist. Es gibt eine Vielzahl von Möglichkeiten, mit denen festgestellt werden kann, wann das Ende der Datei erreicht ist. In diesem Beispiel wird die Methode
Peek zum Überprüfen der jeweils nächsten Zeile verwendet, bevor diese gelesen wird.
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);
}
}
Eine Textdatei schreiben
Im folgenden Codebeispiel wird die Klasse
StreamWriter verwendet, um eine Datei zu erstellen und in eine Datei 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);
Dateiinformationen anzeigen
In diesem Codebeispiel wird die Klasse
FileInfo 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()) );
Laufwerke auflisten
Im folgenden Codebeispiel werden die Klassen
Directory 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
Im folgenden Codebeispiel wird die Methode
GetDirectories der Klasse
Directory verwendet, um die Ordnerliste 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
Im folgenden Codebeispiel wird die Methode
GetFiles der Klasse
Directory verwendet, um die Liste der 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]); } Wenn ein Benutzer auf Dateien zugreift, können viele Vorgänge fehlschlagen. Die Dateien existieren möglicherweise nicht, die Dateien werden eventuell gerade verwendet oder die Benutzer besitzen keine Berechtigungen für die Dateien in Ordnern, auf die Sie zugreifen möchten. Es ist wichtig, diese Möglichkeiten beim Schreiben des Codes in Betracht zu ziehen und die möglicherweise auftretenden Ausnahmen zu berücksichtigen.
Beispiel mit schrittweiser Anleitung
-
Erstellen Sie in Visual C++ .NET eine neue verwaltete C++-Anwendung.
-
Öffnen Sie das Codefenster für <project name> .cpp.
-
Löschen Sie den gesamten Code.
-
Fügen Sie folgenden Code in <project name>.cpp ein:
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
// required dlls for WinForms
#using "System.dll"
#using "System.Windows.Forms.dll"
#using "System.Drawing.dll"
// required namespaces for WinForms
using namespace System::ComponentModel;
using namespace System::Windows::Forms;
using namespace System::Drawing;
__gc class WinForm: public Form
{
private:
Button *button1;
Button *button2;
Button *button3;
Button *button4;
Button *button5;
Button *button6;
String* windir;
ListBox *listbox1;
String *caption; // Caption of the WinForm
int width; // width of the WinForm
int height; // height of the WinForm
public:
WinForm()
{
// Set caption and size of the WinForm
caption = "Form1";
width = 360;
height = 273;
windir=System::Environment::GetEnvironmentVariable("windir");
InitForm();
}
void Dispose()
{
// Form is being destroyed. Do any necessary clean-up here.
Form::Dispose();
}
void InitForm()
{
// Setup controls here
// Basic WinForm Settings
SuspendLayout();
// button1
//
button1 = new Button();
button1->Text = "button1";
button1->Name = "button1";
button1->Size = Drawing::Size(112, 23);
button1->TabIndex = 1;
button1->Location = Drawing::Point(216,32);
button1->Click += (new EventHandler(this, &WinForm::button1_Click));
Controls->Add(button1);
// button2
//
button2 = new Button();
button2->Text = "button2";
button2->Name = "button2";
button2->Size = Drawing::Size(112, 23);
button2->TabIndex = 2;
button2->Location = Drawing::Point(216,64);
button2->Click += (new EventHandler(this, &WinForm::button2_Click));
Controls->Add(button2);
// button3
//
button3 = new Button();
button3->Text = "button3";
button3->Name = "button3";
button3->Size = Drawing::Size(112, 23);
button3->TabIndex = 3;
button3->Location = Drawing::Point(216,96);
button3->Click += (new EventHandler(this, &WinForm::button3_Click));
Controls->Add(button3);
// listbox1
//
listbox1 = new ListBox();
listbox1->Text = "Listbox1";
listbox1->Name = "Listbox1";
listbox1->Size = Drawing::Size(176, 199);
listbox1->TabIndex = 0;
listbox1->Location = Drawing::Point(24,24);
Controls->Add(listbox1);
//
// button4
//
button4 = new Button();
button4->Text = "button4";
button4->Name = "button4";
button4->Size = Drawing::Size(112, 23);
button4->TabIndex = 4;
button4->Location = Drawing::Point(216,128);
button4->Click += (new EventHandler(this, &WinForm::button4_Click));
Controls->Add(button4);
// button5
//
button5 = new Button();
button5->Text = "button5";
button5->Name = "button5";
button5->Size = Drawing::Size(112, 23);
button5->TabIndex = 5;
button5->Location = Drawing::Point(216,160);
button5->Click += (new EventHandler(this, &WinForm::button5_Click));
Controls->Add(button5);
// button6
//
button6 = new Button();
button6->Text = "button6";
button6->Name = "button6";
button6->Size = Drawing::Size(112, 23);
button6->TabIndex = 6;
button6->Location = Drawing::Point(216,192);
button6->Click += (new EventHandler(this, &WinForm::button6_Click));
Controls->Add(button6);
Text = caption;
Size = System::Drawing::Size(width, height);
Name = "Form1";
Text = "Form1";
Load += new System::EventHandler(this, Form1_Load);
ResumeLayout(false);
}
void button6_Click(Object *sender, EventArgs *e)
{
//how to obtain list of files (example uses 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]);
}
}
void button1_Click(Object *sender, EventArgs *e)
{
//how to read a text file
//try...catch is to deal with a 0 byte file or non-existant file
listbox1->Items->Clear();
try
{
String* textFile = String::Concat(windir, ("\\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);
}
}
void Form1_Load(Object *sender, EventArgs *e)
{
button1->Text = "Read Text File";
button2->Text = "Write Text File";
button3->Text = "View File Information";
button4->Text = "List Drives";
button5->Text = "List Subfolders";
button6->Text = "List Files";
}
void button5_Click(Object *sender, EventArgs *e)
{
//how to get a list of folders (example uses 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]);
}
}
void button4_Click(Object *sender, EventArgs *e)
{
//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]);
}
}
void button3_Click(Object *sender, EventArgs *e)
{
//how to retrieve file properties (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()) );
}
void button2_Click(Object *sender, EventArgs *e)
{
//demonstrates how to create and write to a text file
StreamWriter* pwriter = new StreamWriter("c:\\KBTest.txt");
pwriter->WriteLine("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);
}
};
void main()
{
// This line creates an instance of WinForm, and
// uses it as the Main Window of the application.
Application::Run(new WinForm());
} -
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen. Klicken Sie danach auf Eigenschaften. Wählen Sie C/C++, und klicken Sie danach auf Vorkompilierte Header. Ändern Sie die Einstellung von Erstellen/Verwenden eines vorkompilierten Headers in Vorkompilierte Header nicht verwenden um, und speichern Sie anschließend das Projekt.
-
Drücken Sie die Taste [F5], um die Anwendung zu erstellen und auszuführen. Klicken Sie auf die Schaltflächen, um die verschiedenen Aktionen anzuzeigen.
Weitere Informationen dazu, wie Sie Windows-Formulare in verwalteten Erweiterungen für Visual C++ erstellen, finden Sie in dem Beispiel "ManagedCWinFormWiz" in der Onlinehilfe von Visual Studio .NET.
Weitere allgemeine Informationen zu Visual C++ .NET finden Sie in folgenden Usenet-Newsgroups:
Artikel-ID: 307398 - Geändert am: Mittwoch, 29. Oktober 2003 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
- Microsoft Visual C++ .NET 2003 Standard Edition
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.