Udostępnij za pośrednictwem


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.

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, Directoryklasy , DirectoryInfo i inne powiązane klasy w programie .NET Framework oferują funkcje, które nie są dostępne w FileSystemObjectprzypadku 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

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:

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

  2. Rozwiń węzeł Właściwości konfiguracji, a następnie kliknij przycisk 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 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

  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ę Aplikacja formularzy systemu Windows (.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 F4, aby otworzyć okno Właściwości.

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

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

    Uwaga 16.

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

  8. 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
  9. Otwórz plik Form1.h. W deklaracji klasy zadeklaruj Form1 jedną zmienną prywatną String za pomocą 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 danych wyjściowych danych wejściowych pliku, dodaj System::IO przestrzeń nazw.

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