Wykonywanie podstawowych operacji we/wy w języku Visual C++
W tym artykule opisano sposób wykonywania podstawowych operacji wejścia/wyjścia pliku (we/wy) w programie Microsoft Visual C++ lub visual C++ .NET.
Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 307398
Podsumowanie
Jeśli dopiero zaczynasz korzystać z programu .NET Framework, przekonasz się, że model obiektów dla operacji na plikach w programie .NET Framework jest podobny do FileSystemObject
popularnego dla wielu deweloperów programu Visual Studio.
Aby ułatwić przejście, zobacz How To Use FileSystemObject with Visual Basic (Jak używać obiektu FileSystemObject w visual basic).
Aby zapoznać się z wersją platformy .NET języka Visual C# w tym artykule, zobacz How to do basic file I/O in Visual C#(Jak wykonać podstawowe we/wy pliku w języku Visual C#).
W tym artykule opisano następujące przestrzenie nazw biblioteki klas programu .NET Framework:
System::ComponentModel
System::Windows::Forms
System::Drawing
Nadal można używać narzędzia FileSystemObject
w programie .NET Framework. FileSystemObject
Ponieważ element jest składnikiem modelu obiektów składników (COM), program .NET Framework wymaga dostępu do obiektu za pośrednictwem warstwy międzyoperacyjnej. Program .NET Framework generuje otokę dla składnika, jeśli chcesz go użyć. Jednak File
klasa, FileInfo
klasa, Directory
klasy , DirectoryInfo
i inne powiązane klasy w programie .NET Framework oferują funkcje, które nie są dostępne w FileSystemObject
przypadku warstwy , bez obciążenia warstwy międzyoperacyjnej.
Pokazane operacje we/wy pliku
W przykładach w tym artykule opisano podstawowe operacje we/wy plików. W sekcji Przykład krok po kroku opisano sposób tworzenia przykładowego programu, który demonstruje następujące sześć operacji we/wy plików:
- Odczytywanie pliku tekstowego
- Pisanie pliku tekstowego
- Wyświetlanie informacji o pliku
- Wyświetlanie listy dysków
- Wyświetlanie listy podfolderów
- Wyświetlanie listy plików
Odczytywanie pliku tekstowego
Poniższy przykładowy kod używa StreamReader
klasy do odczytywania pliku tekstowego. Zawartość pliku jest dodawana do kontrolki ListBox. Blok try...catch
jest używany do powiadamiania programu, jeśli plik jest pusty. Istnieje wiele sposobów określania, kiedy zostanie osiągnięty koniec pliku; W tym przykładzie użyto Peek
metody do zbadania następnego wiersza przed jego odczytaniem.
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);
}
W programie Visual C++należy dodać opcję kompilatora obsługi języka wspólnego (/clr:oldSyntax), aby pomyślnie skompilować poprzedni przykład kodu jako zarządzany język C++. Aby dodać opcję kompilatora obsługi środowiska uruchomieniowego języka wspólnego, wykonaj następujące kroki:
Kliknij pozycję Project (Projekt), a następnie kliknij pozycję< ProjectName Properties (Właściwości projectname>).
Uwaga 16.
<ProjectName> to symbol zastępczy nazwy projektu.
Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij przycisk Ogólne.
W okienku po prawej stronie kliknij, aby wybrać pozycję Obsługa środowiska uruchomieniowego języka wspólnego, stara składnia (/clr:oldSyntax) w ustawieniach projektu obsługi środowiska uruchomieniowego języka wspólnego.
Kliknij Zastosuj a następnie kliknij OK.
Pisanie pliku tekstowego
Ten przykładowy kod używa StreamWriter
klasy do tworzenia i zapisywania w pliku. Jeśli masz istniejący plik, możesz go otworzyć w taki sam sposób.
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);
Wyświetlanie informacji o pliku
Ten przykładowy kod używa FileInfo
klasy w celu uzyskania dostępu do właściwości pliku. Notepad.exe jest używany w tym przykładzie. Właściwości są wyświetlane w kontrolce ListBox.
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()));
Wyświetlanie listy dysków
Ten przykładowy kod używa Directory
klas i Drive
do wyświetlania listy dysków logicznych w systemie. W tym przykładzie wyniki są wyświetlane w kontrolce ListBox.
listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
listBox1->Items->Add(drives[i]);
}
Wyświetlanie listy podfolderów
Ten przykładowy kod używa GetDirectories
metody Directory
klasy do uzyskania listy folderów.
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 plików
Ten przykładowy kod używa GetFiles
metody Directory
klasy do uzyskania listy plików.
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]);
}
Wiele rzeczy może pójść źle, gdy użytkownik uzyska dostęp do plików. Pliki mogą nie istnieć, pliki mogą być używane lub użytkownicy nie mają praw do plików folderów, do których próbują uzyskać dostęp. Podczas pisania kodu do obsługi wyjątków, które mogą być generowane, należy wziąć pod uwagę te możliwości.
Przykład krok po kroku
Uruchom program Visual Studio .NET.
W menu Plik wskaż polecenie Nowy, a następnie kliknij Projekt.
W obszarze Typy projektów kliknij pozycję Projekty Visual C++. W sekcji Szablony kliknij pozycję Aplikacja formularzy systemu Windows (.NET).
Wpisz KB307398 w polu Nazwa , wpisz
C:\
w polu Lokalizacja , a następnie kliknij przycisk OK.Otwórz formularz Form1 w widoku Projekt, a następnie naciśnij F4, aby otworzyć okno Właściwości.
W oknie Właściwości rozwiń folder Rozmiar. W polu Szerokość wpisz wartość 700. W polu Wysokość wpisz wartość 320.
Dodaj jedną kontrolkę ListBox i sześć kontrolek Przycisk do formularza Form1.
Uwaga 16.
Aby wyświetlić przybornik, kliknij pozycję Przybornik w menu Widok .
W oknie Właściwości zmień lokalizację, nazwę, rozmiar, tabindex i właściwości Text tych kontrolek w następujący sposób:
Identyfikator kontrolki Lokalizacja Nazwisko Rozmiar TabIndex Text button1 500, 32 button1 112, 23 1 Odczyt pliku tekstowego button2 500, 64 button2 112, 23 2 Pisanie pliku tekstowego button3 500, 96 button3 112, 23 3 Wyświetl informacje o pliku button4 500, 128 button4 112, 23 100 Lista dysków button5 500, 160 button5 112, 23 5 Podfoldery listy button6 500, 192 button6 112, 23 6 Wyświetlanie listy plików listBox1 24, 24 listBox1 450, 200 0 listBox1 Otwórz plik Form1.h. W deklaracji klasy zadeklaruj
Form1
jedną zmienną prywatnąString
za pomocą następującego kodu:private: String *windir;
W konstruktorze
Form1
klasy dodaj następujący kod:windir = System::Environment::GetEnvironmentVariable("windir");
Aby wykonać operacje danych wyjściowych danych wejściowych pliku, dodaj
System::IO
przestrzeń nazw.Naciśnij SHIFT+F7, aby otworzyć formularz Form1 w widoku projektu. Kliknij dwukrotnie przycisk Odczyt pliku tekstowego, a następnie wklej następujący 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); }
W widoku Projekt Form1 kliknij dwukrotnie przycisk Napisz plik tekstowy, a następnie wklej następujący 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);
W widoku Projektu Form1 kliknij dwukrotnie przycisk Wyświetl informacje o pliku, a następnie wklej następujący kod w metodzie :
// 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()));
W widoku Projekt Formularza1 kliknij dwukrotnie przycisk Wyświetl dyski, a następnie wklej następujący 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]); }
W widoku Projekt Formularza1 kliknij dwukrotnie przycisk Podfoldery listy, a następnie wklej następujący 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]); }
W widoku Projekt Formularza1 kliknij dwukrotnie przycisk Wyświetl pliki, a następnie wklej następujący 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]); }
Aby skompilować, a następnie uruchomić program, naciśnij CTRL+F5.
Kompletny przykład kodu
//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;
}
Informacje
Aby uzyskać więcej informacji, odwiedź stronę pomoc techniczna firmy Microsoft. Aby uzyskać więcej informacji na temat tworzenia formularzy systemu Windows w rozszerzeniach zarządzanych dla języka C++, zobacz przykład w ManagedCWinFormWiz
pomocy programu Visual Studio .NET.