Wykonaj podstawowe we/wy plików w programie Visual C++
W tym artykule opisano sposób wykonywania podstawowych operacji wejścia/wyjścia pliku (We/Wy) w Microsoft Visual C++ lub na platformie .NET w języku Visual C++.
Oryginalna wersja produktu: Visual C++
Oryginalny numer KB: 307398
Podsumowanie
Jeśli dopiero zaczynasz korzystać z .NET Framework, przekonasz się, że model obiektów dla operacji na plikach w .NET Framework jest podobny do popularnego FileSystemObject
wśród wielu deweloperów programu Visual Studio.
Aby ułatwić przejście, zobacz How to Use FileSystemObject with Visual Basic (Jak używać elementu FileSystemObject w języku Visual Basic).
Aby zapoznać się z wersją programu Visual C# dla platformy .NET tego artykułu, zobacz Jak wykonywać podstawowe we/wy plików w języku Visual C#.
W tym artykule opisano następujące przestrzenie nazw biblioteki klas .NET Framework:
System::ComponentModel
System::Windows::Forms
System::Drawing
Nadal można używać elementu FileSystemObject
w .NET Framework. FileSystemObject
Ponieważ element jest składnikiem modelu obiektów składników (COM), .NET Framework wymaga, aby dostęp do obiektu odbywał się za pośrednictwem warstwy Międzyoperacyjnej. Jeśli chcesz go użyć, .NET Framework generuje otokę dla składnika. Jednak File
klasa, FileInfo
klasa, Directory
klasy , DirectoryInfo
i inne powiązane klasy w .NET Framework oferują funkcje, które nie są dostępne w systemie FileSystemObject
, bez narzutu warstwy Interop.
Zademonstrowane operacje we/wy plików
W przykładach w tym artykule opisano podstawowe operacje we/wy plików. W sekcji przykładowej krok po kroku opisano sposób tworzenia przykładowego programu, który demonstruje sześć następujących operacji we/wy plików:
- Odczytywanie pliku tekstowego
- Pisanie pliku tekstowego
- Wyświetlanie informacji o pliku
- Wyświetlanie listy dysków
- Wyświetl listę folderów podrzędnych
- Wyświetlanie listy plików
Odczytywanie pliku tekstowego
Poniższy przykładowy kod używa StreamReader
klasy do odczytu 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, aby określić, kiedy zostanie osiągnięty koniec pliku; W tym przykładzie użyto Peek
metody do zbadania następnego wiersza przed odczytem.
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 środowiska uruchomieniowego 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ę Projekt, a następnie kliknij pozycję <Właściwości projectname>.
Uwaga
<ProjectName> jest symbolem zastępczym nazwy projektu.
Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij pozycję 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 przycisk Zastosuj, a następnie przycisk 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 otworzyć go w ten 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 do uzyskiwania 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 Directory
kod używa 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świetl listę folderów podrzędnych
Ten przykładowy GetDirectories
kod używa metody klasy w Directory
celu 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]);
}
Wyświetlanie listy plików
Ten przykładowy GetFiles
kod używa metody klasy w Directory
celu 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ść nie tak, gdy użytkownik uzyska dostęp do plików. Pliki mogą nie istnieć, pliki mogą być używane lub użytkownicy mogą nie mieć praw do plików folderów, do których próbują uzyskać dostęp. Rozważ te możliwości podczas pisania kodu w celu obsługi wyjątków, które mogą zostać wygenerowane.
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ę Windows Forms Application (.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 klawisz F4, aby otworzyć okno Właściwości .
W oknie Właściwości rozwiń folder Rozmiar . W polu Szerokość wpisz 700. W polu Wysokość wpisz 320.
Dodaj jedną kontrolkę ListBox i sześć kontrolek Przycisk do formularza Form1.
Uwaga
Aby wyświetlić przybornik, kliknij pozycję Przybornik w menu Widok .
W oknie Właściwości zmień właściwości Location( Lokalizacja), Name (Nazwa), Size (Rozmiar), TabIndex (TabIndex) i Text ( Tekst ) tych kontrolek w następujący sposób:
Identyfikator kontrolki Lokalizacja Name (Nazwa) Rozmiar Tabindex Tekst przycisk1 500, 32 przycisk1 112, 23 1 Odczytywanie pliku tekstowego przycisk2 500, 64 przycisk2 112, 23 2 Zapisywanie pliku tekstowego przycisk 3 500, 96 przycisk 3 112, 23 3 Wyświetlanie informacji o pliku przycisk4 500, 128 przycisk4 112, 23 4 Lista dysków przycisk5 500, 160 przycisk5 112, 23 5 Podfoldery listy przycisk6 500, 192 przycisk6 112, 23 6 Pliki listy listBox1 24, 24 listBox1 450, 200 0 listBox1 Otwórz plik Form1.h . W deklaracji klasy zadeklaruj
Form1
jedną zmienną prywatnąString
przy użyciu następującego kodu:private: String *windir;
W konstruktorze
Form1
klasy dodaj następujący kod:windir = System::Environment::GetEnvironmentVariable("windir");
Aby wykonać operacje wprowadzania danych wyjściowych pliku, dodaj
System::IO
przestrzeń nazw.Naciśnij klawisze SHIFT+F7, aby otworzyć formularz Form1 w widoku projektu. Kliknij dwukrotnie przycisk Odczytaj plik tekstowy , 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 Projektowanie formularza 1 kliknij dwukrotnie przycisk Zapisz 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 Projektowanie formularza 1 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 Projektowanie formularza 1 kliknij dwukrotnie przycisk Lista dysków, 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 Projektowanie formularza 1 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 Projektowanie formularza 1 kliknij dwukrotnie przycisk Lista plików, 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 klawisze 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 programie ManagedCWinFormWiz
Visual Studio .NET Help.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla