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.

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, Directoryklasy , 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

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:

  1. Kliknij pozycję Projekt, a następnie kliknij pozycję <Właściwości projectname>.

    Uwaga

    <ProjectName> jest symbolem zastępczym nazwy projektu.

  2. Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij pozycję Ogólne.

  3. 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.

  4. 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

  1. Uruchom program Visual Studio .NET.

  2. W menu Plik wskaż polecenie Nowy, a następnie kliknij Projekt.

  3. W obszarze Typy projektów kliknij pozycję Projekty Visual C++. W sekcji Szablony kliknij pozycję Windows Forms Application (.NET).

  4. Wpisz KB307398 w polu Nazwa , wpisz C:\ w polu Lokalizacja , a następnie kliknij przycisk OK.

  5. Otwórz formularz Form1 w widoku Projekt, a następnie naciśnij klawisz F4, aby otworzyć okno Właściwości .

  6. W oknie Właściwości rozwiń folder Rozmiar . W polu Szerokość wpisz 700. W polu Wysokość wpisz 320.

  7. Dodaj jedną kontrolkę ListBox i sześć kontrolek Przycisk do formularza Form1.

    Uwaga

    Aby wyświetlić przybornik, kliknij pozycję Przybornik w menu Widok .

  8. 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
  9. Otwórz plik Form1.h . W deklaracji klasy zadeklaruj Form1 jedną zmienną prywatną String przy użyciu następującego kodu:

    private:
    String *windir;
    
  10. W konstruktorze Form1 klasy dodaj następujący kod:

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Aby wykonać operacje wprowadzania danych wyjściowych pliku, dodaj System::IO przestrzeń nazw.

  12. 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);
    }
    
  13. 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);
    
  14. 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()));
    
  15. 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]);
    }
    
  16. 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]);
    }
    
  17. 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]);
    }
    
  18. 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.