Aracılığıyla paylaş


Visual C++'da temel dosya G/Ç'si yapma

Bu makalede, Microsoft Visual C++ veya Visual C++ .NET'te temel dosya girişi/çıkışı (G/Ç) işlemlerinin nasıl gerçekleştirildiği açıklanmaktadır.

Özgün ürün sürümü: Visual C++
Özgün KB numarası: 307398

Özet

.NET Framework'te yeniyseniz, .NET Framework'teki dosya işlemleri için nesne modelinin, birçok Visual Studio geliştiricisi tarafından popüler olan nesne modeline FileSystemObject benzer olduğunu göreceksiniz.

  • Geçişi kolaylaştırmak için bkz . Visual Basic ile FileSystemObject Kullanma.

  • Bu makalenin Visual C# .NET sürümü için bkz . Visual C# içinde temel dosya G/Ç'si yapma.

Bu makale aşağıdaki .NET Framework Sınıf Kitaplığı ad alanlarına başvurur:

  • System::ComponentModel
  • System::Windows::Forms
  • System::Drawing

'yi FileSystemObject .NET Framework'te kullanmaya devam edebilirsiniz. FileSystemObject bir Bileşen Nesne Modeli (COM) bileşeni olduğundan, .NET Framework nesneye erişimin Birlikte Çalışma katmanı üzerinden olmasını gerektirir. .NET Framework, kullanmak istiyorsanız bileşeni sizin için bir sarmalayıcı oluşturur. Bununla birlikte File , sınıfı, FileInfo sınıfı, Directory, DirectoryInfo sınıfları ve .NET Framework'teki diğer ilgili sınıflar, Birlikte Çalışma katmanının ek yükü olmadan ile FileSystemObjectkullanılabilir olmayan işlevler sunar.

Dosya G/Ç işlemleri gösterildi

Bu makaledeki örneklerde temel dosya G/Ç işlemleri açıklanmaktadır. Adım adım örnek bölümünde, aşağıdaki altı dosya G/Ç işlemini gösteren örnek bir programın nasıl oluşturulacağı açıklanır:

Metin dosyası okuma

Aşağıdaki örnek kod, metin StreamReader dosyasını okumak için bir sınıf kullanır. Dosyanın içeriği listbox denetimine eklenir. Blok try...catch , dosya boşsa programı uyarmak için kullanılır. Dosyanın sonuna ulaşıldığında belirlemenin birçok yolu vardır; Bu örnek, okumadan önce sonraki satırı incelemek için yöntemini kullanır Peek .

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);
}

Visual C++'da, önceki kod örneğini yönetilen C++ olarak başarıyla derlemek için ortak dil çalışma zamanı desteği derleyici seçeneğini (/clr:oldSyntax) eklemeniz gerekir. Ortak dil çalışma zamanı desteği derleyicisi seçeneğini eklemek için şu adımları izleyin:

  1. Proje'ye ve ardından ProjectName Özellikleri'ne> tıklayın<.

    Not

    <ProjectName> , projenin adı için bir yer tutucudur.

  2. Yapılandırma Özellikleri'ni genişletin ve genel'e tıklayın.

  3. Sağ bölmede Ortak Dil Çalışma Zamanı Desteği, Ortak Dil Çalışma Zamanı destek projesi ayarlarında Eski Söz Dizimi (/clr:oldSyntax) öğesini seçmek için tıklayın.

  4. Uygula'ya ve sonra da Tamam'a tıklayın.

Metin dosyası yazma

Bu örnek kod, dosya StreamWriter oluşturmak ve dosyaya yazmak için bir sınıf kullanır. Mevcut bir dosyanız varsa, dosyayı aynı şekilde açabilirsiniz.

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);

Dosya bilgilerini görüntüleme

Bu örnek kod, bir FileInfo dosyanın özelliklerine erişmek için bir sınıf kullanır. Notepad.exe bu örnekte kullanılır. Özellikler bir ListBox denetiminde görünür.

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()));

Disk sürücülerini listeleme

Bu örnek kod, sistemdeki Directory mantıksal sürücüleri listelemek için ve Drive sınıflarını kullanır. Bu örnek için sonuçlar ListBox denetiminde görünür.

listBox1->Items->Clear();
String* drives[] = Directory::GetLogicalDrives();
int numDrives = drives->get_Length();
for (int i=0; i<numDrives; i++)
{
    listBox1->Items->Add(drives[i]);
}

Alt klasörleri listeleme

Bu örnek kod, klasörlerin GetDirectories Directory listesini almak için sınıfının yöntemini kullanır.

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]);
}

Dosyaları listeleme

Bu örnek kod, dosyaların listesini almak için sınıfının yöntemini Directory kullanırGetFiles.

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]);
}

Kullanıcı dosyalara eriştiğinde birçok sorun oluşabilir. Dosyalar mevcut olmayabilir, dosyalar kullanımda olabilir veya kullanıcıların erişmeye çalıştıkları klasör dosyaları üzerinde hakları olmayabilir. Oluşturulabilecek özel durumları işlemek için kod yazarken bu olasılıkları göz önünde bulundurun.

Adım adım örnek

  1. Visual Studio .NET'i başlatın.

  2. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın.

  3. Proje Türleri'nin altında Visual C++ Projeleri'ne tıklayın. Şablonlar bölümünde Windows Forms Uygulaması (.NET) öğesine tıklayın.

  4. Ad kutusuna KB307398 yazın, Konum kutusuna yazın C:\ ve tamam'a tıklayın.

  5. Tasarım görünümünde Form1 formunu açın ve ardından Özellikler penceresini açmak için F4 tuşuna basın.

  6. Özellikler penceresinde Boyut klasörünü genişletin. Genişlik kutusuna 700 yazın. Yükseklik kutusuna 320 yazın.

  7. Form1'e bir ListBox denetimi ve altı Düğme denetimi ekleyin.

    Not

    Araç kutusunu görüntülemek için Görünüm menüsünde Araç Kutusu'na tıklayın.

  8. Özellikler penceresinde, bu denetimlerin Konum, Ad, Boyut, TabIndex ve Metin özelliklerini aşağıdaki gibi değiştirin:

    Denetim Kimliği Konum Veri Akışı Adı Size TabIndex Metin
    düğme1 500, 32 düğme1 112, 23 1 Metin Dosyasını Oku
    düğme2 500, 64 düğme2 112, 23 2 Metin Dosyası Yazma
    düğme3 500, 96 düğme3 112, 23 3 Dosya Bilgilerini Görüntüle
    düğme4 500, 128 düğme4 112, 23 4 Sürücüleri Listele
    düğme5 500, 160 düğme5 112, 23 5 Alt Klasörleri Listele
    düğme6 500, 192 düğme6 112, 23 6 Liste Dosyaları
    listBox1 24, 24 listBox1 450, 200 0 listBox1
  9. Form1.h dosyasını açın. Sınıf bildiriminde Form1 aşağıdaki kodla bir özel String değişken bildirin:

    private:
    String *windir;
    
  10. Sınıf oluşturucusunda Form1 aşağıdaki kodu ekleyin:

    windir = System::Environment::GetEnvironmentVariable("windir");
    
  11. Dosya Girişi çıkış işlemlerini yapmak için ad alanını System::IO ekleyin.

  12. Form1'i Tasarım görünümünde açmak için SHIFT+F7 tuşlarına basın. Metin Dosyasını Oku düğmesine çift tıklayın ve aşağıdaki kodu yapıştırın:

    // 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. Form1 Tasarım görünümünde Metin Dosyası Yaz düğmesine çift tıklayın ve aşağıdaki kodu yapıştırın:

    // 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. Form1 Tasarım görünümünde, Dosya Bilgilerini Görüntüle düğmesine çift tıklayın ve aşağıdaki kodu yöntemine yapıştırın:

    // 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. Form1 Tasarım görünümünde Sürücüleri Listele düğmesine çift tıklayın ve aşağıdaki kodu yapıştırın:

    // 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. Form1 Tasarım görünümünde, Alt Klasörleri Listele düğmesine çift tıklayın ve aşağıdaki kodu yapıştırın:

    // 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. Form1 Tasarım görünümünde, Dosyaları Listele düğmesine çift tıklayın ve aşağıdaki kodu yapıştırın:

    // 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. Programı derlemek ve çalıştırmak için CTRL+F5 tuşlarına basın.

Tam kod örneği

//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;
}

Başvurular

Daha fazla bilgi için Microsoft Desteği adresini ziyaret edin. C++ için yönetilen uzantılarda Windows formları oluşturma hakkında daha fazla bilgi için Visual Studio .NET Yardımı'ndaki örneğe bakın ManagedCWinFormWiz .