Gör grundläggande fil-I/O i Visual C++
Den här artikeln beskriver hur du utför grundläggande I/O-åtgärder (file input/output) i Microsoft Visual C++ eller i Visual C++ .NET.
Ursprunglig produktversion: Visual C++
Ursprungligt KB-nummer: 307398
Sammanfattning
Om du inte har använt .NET Framework tidigare ser du att objektmodellen för filåtgärder i .NET Framework liknar den FileSystemObject
som är populär bland många Visual Studio-utvecklare.
Information om hur du gör övergången enklare finns i Använda FileSystemObject med Visual Basic.
En Visual C# .NET-version av den här artikeln finns i Så här gör du grundläggande fil-I/O i Visual C#.
Den här artikeln refererar till följande namnområden för .NET Framework-klassbibliotek:
System::ComponentModel
System::Windows::Forms
System::Drawing
Du kan fortfarande använda FileSystemObject
i .NET Framework. Eftersom är en komponent för FileSystemObject
komponentobjektmodell (COM) kräver .NET Framework att åtkomsten till objektet sker via Interop-lagret. .NET Framework genererar en omslutning för komponenten åt dig om du vill använda den. File
Klassen, FileInfo
klassen, Directory
klasserna , DirectoryInfo
och andra relaterade klasser i .NET Framework erbjuder dock funktioner som inte är tillgängliga med FileSystemObject
, utan omkostnaderna för Interop-lagret.
Demonstrerade fil-I/O-åtgärder
Exemplen i den här artikeln beskriver grundläggande I/O-åtgärder för filer. I avsnittet Stegvisa exempel beskrivs hur du skapar ett exempelprogram som visar följande sex I/O-filåtgärder:
- Läsa en textfil
- Skriva en textfil
- Visa filinformation
- Visa en lista över diskenheter
- Visa en lista över undermappar
- Lista filer
Läsa en textfil
Följande exempelkod använder en StreamReader
klass för att läsa en textfil. Innehållet i filen läggs till i en ListBox-kontroll. Blocket try...catch
används för att varna programmet om filen är tom. Det finns många sätt att avgöra när slutet av filen har nåtts. i det här exemplet används Peek
metoden för att undersöka nästa rad innan du läser den.
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);
}
I Visual C++måste du lägga till kompilatoralternativet common language runtime support (/clr:oldSyntax) för att kunna kompilera det tidigare kodexemplet som hanterad C++. Följ dessa steg om du vill lägga till det vanliga alternativet för språkkörningsstöd för kompilator:
Klicka på Projekt och sedan på <ProjectName-egenskaper>.
Kommentar
<ProjectName> är en platshållare för projektets namn.
Expandera Konfigurationsegenskaper och klicka sedan på Allmänt.
I den högra rutan klickar du för att välja Stöd för common language runtime, gammal syntax (/clr:oldSyntax) i inställningarna för Common Language Runtime-supportprojekt.
Klicka först på Använd och sedan på OK.
Skriva en textfil
Den här exempelkoden använder en StreamWriter
klass för att skapa och skriva till en fil. Om du har en befintlig fil kan du öppna den på samma sätt.
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);
Visa filinformation
Den här exempelkoden använder en FileInfo
klass för att komma åt en fils egenskaper. Notepad.exe används i det här exemplet. Egenskaperna visas i en ListBox-kontroll.
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()));
Visa en lista över diskenheter
Den här exempelkoden använder klasserna Directory
och Drive
för att lista de logiska enheterna i ett system. För det här exemplet visas resultatet i en ListBox-kontroll.
listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
listBox1->Items->Add(drives[i]);
}
Visa en lista över undermappar
Den här exempelkoden använder GetDirectories
klassens Directory
metod för att hämta en lista med mappar.
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]);
}
Lista filer
Den här exempelkoden använder GetFiles
-metoden för Directory
klassen för att hämta en lista över filer.
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]);
}
Många saker kan gå fel när en användare får åtkomst till filer. Filerna kanske inte finns, filerna kan användas eller så kanske användarna inte har behörighet till de filer med mappar som de försöker komma åt. Tänk på dessa möjligheter när du skriver kod för att hantera de undantag som kan genereras.
Detaljerat exempel
Starta Visual Studio .NET.
Peka på Nytt på Arkiv-menyn och klicka sedan på Projekt.
Under Projekttyper klickar du på Visual C++ Projects. Under avsnittet Mallar klickar du på Windows Forms Application (.NET).
Skriv KB307398 i rutan Namn , skriv
C:\
i rutan Plats och klicka sedan på OK.Öppna formuläret Form1 i designvyn och tryck sedan på F4 för att öppna fönstret Egenskaper.
I fönstret Egenskaper expanderar du mappen Storlek . I rutan Bredd skriver du 700. Skriv 320 i rutan Höjd.
Lägg till en ListBox-kontroll och sex knappkontroller i Form1.
Kommentar
Om du vill visa verktygslådan klickar du på Verktygslåda på menyn Visa .
I fönstret Egenskaper ändrar du egenskaperna Plats, Namn, Storlek, TabIndex och Text för dessa kontroller enligt följande:
Kontroll-ID Plats Name Storlek Flikindex Text knapp1 500, 32 knapp1 112, 23 1 Läs textfil knapp2 500, 64 knapp2 112, 23 2 Skriva textfil knapp3 500, 96 knapp3 112, 23 3 Visa filinformation knapp4 500, 128 knapp4 112, 23 4 Lista enheter knapp5 500, 160 knapp5 112, 23 5 Lista undermappar knapp6 500, 192 knapp6 112, 23 6 Lista filer listBox1 24, 24 listBox1 450, 200 0 listBox1 Öppna filen Form1.h.
Form1
Deklarera en privatString
variabel med följande kod i klassdeklarationen:private: String *windir;
Lägg till följande kod i
Form1
klasskonstruktorn:windir = System::Environment::GetEnvironmentVariable("windir");
Om du vill utföra utdataåtgärder för indata lägger du till
System::IO
namnområdet.Tryck på SKIFT+F7 för att öppna Form1 i designvyn. Dubbelklicka på knappen Läs textfil och klistra sedan in följande kod:
// 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); }
I vyn Form1-design dubbelklickar du på knappen Skriv textfil och klistrar sedan in följande kod:
// 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);
I vyn Form1-design dubbelklickar du på knappen Visa filinformation och klistrar sedan in följande kod i metoden:
// 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()));
I vyn Form1-design dubbelklickar du på knappen Listenheter och klistrar sedan in följande kod:
// 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]); }
I vyn Form1-design dubbelklickar du på knappen Listundermappar och klistrar sedan in följande kod:
// 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]); }
I vyn Form1-design dubbelklickar du på knappen Listfiler och klistrar sedan in följande kod:
// 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]); }
Om du vill skapa och sedan köra programmet trycker du på CTRL+F5.
Fullständigt kodexempel
//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;
}
Referenser
Mer information finns i Microsoft Support. Mer information om hur du skapar Windows-formulär i hanterade tillägg för C++finns i exemplet i Visual Studio .NET-hjälpen ManagedCWinFormWiz
.