Dela via


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.

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

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:

  1. Klicka på Projekt och sedan på <ProjectName-egenskaper>.

    Kommentar

    <ProjectName> är en platshållare för projektets namn.

  2. Expandera Konfigurationsegenskaper och klicka sedan på Allmänt.

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

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

  1. Starta Visual Studio .NET.

  2. Peka på Nytt på Arkiv-menyn och klicka sedan på Projekt.

  3. Under Projekttyper klickar du på Visual C++ Projects. Under avsnittet Mallar klickar du på Windows Forms Application (.NET).

  4. Skriv KB307398 i rutan Namn , skriv C:\ i rutan Plats och klicka sedan på OK.

  5. Öppna formuläret Form1 i designvyn och tryck sedan på F4 för att öppna fönstret Egenskaper.

  6. I fönstret Egenskaper expanderar du mappen Storlek . I rutan Bredd skriver du 700. Skriv 320 i rutan Höjd.

  7. Lägg till en ListBox-kontroll och sex knappkontroller i Form1.

    Kommentar

    Om du vill visa verktygslådan klickar du på Verktygslådamenyn Visa .

  8. 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
  9. Öppna filen Form1.h. Form1 Deklarera en privat String variabel med följande kod i klassdeklarationen:

    private:
    String *windir;
    
  10. Lägg till följande kod i Form1 klasskonstruktorn:

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Om du vill utföra utdataåtgärder för indata lägger du till System::IO namnområdet.

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