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.
Zie FileSystemObject gebruiken met Visual Basic om de overgang gemakkelijker te maken.
Zie Voor een Visual C# .NET-versie van dit artikel de basisbestands-I/O in Visual C#.
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 Directory
klassen 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
- Een tekstbestand schrijven
- Bestandsgegevens weergeven
- Schijfstations vermelden
- Submappen weergeven
- Bestanden weergeven
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:
Klik op Project en klik vervolgens op <ProjectName> Properties.
Notitie
<ProjectName> is een tijdelijke aanduiding voor de naam van het project.
Vouw configuratie-eigenschappen uit en klik vervolgens op Algemeen.
Klik in het rechterdeelvenster om Common Language Runtime-ondersteuning, oude syntaxis (/clr:oldSyntax) te selecteren in de instellingen van het Common Language Runtime-ondersteuningsproject.
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
Start Visual Studio .NET.
Wijs in het menu Bestand naar Nieuw en klik vervolgens op Project.
Klik onder Projecttypen op Visual C++ Projecten. Klik in de sectie Sjablonen op Windows Forms-toepassing (.NET).
Typ KB307398 in het vak Naam , typ
C:\
het vak Locatie en klik op OK.Open het formulier Form1 in de ontwerpweergave en druk vervolgens op F4 om het venster Eigenschappen te openen.
Vouw in het venster Eigenschappen de map Grootte uit. Typ 700 in het vak Breedte. Typ 320 in het vak Hoogte.
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 .
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 Open het bestand Form1.h . Declareer in de
Form1
klassedeclaratie één privévariabeleString
met de volgende code:private: String *windir;
Voeg in de
Form1
klasseconstructor de volgende code toe:windir = System::Environment::GetEnvironmentVariable("windir");
Als u uitvoerbewerkingen voor bestandsinvoer wilt uitvoeren, voegt u de
System::IO
naamruimte toe.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); }
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);
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()));
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]); }
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]); }
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]); }
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++.