Как сделать основные ввода и вывода файлов в Visual C++ или Visual C++ .NET


Для Microsoft Visual C++ .NET 2005 или 2008 ECMA c + +/ CLI версия этой статьи 950617 см.

Microsoft Visual C# .NET версии данной статьи см.
304430 .
Для версии Microsoft Visual Basic .NET в данной статье см.
304427 .
В данной статье относится к следующие пространства имен библиотеки классов Microsoft платформа.NET Framework:
  • System::ComponentModel
  • System::Windows::Forms
  • System::Drawing

Обзор


В этой статье описывается, как сделать шесть основных ввода вывода (I/O) файлов в Microsoft Visual C++ 2005 или Microsoft Visual C++ .NET. Если вы новичок в платформа.NET Framework, вы найдете объектной модели для операций с файлами в платформа.NET Framework аналогична FileSystemObject (FSO), популярны среди многих разработчиков Microsoft Visual Studio 6.0. Чтобы облегчить переход, функциональные возможности, описанные в этой статье основан на следующей статье Microsoft Knowledge Base:
186118 способы использования FileSystemObject с Visual Basic

Можно по-прежнему использовать FileSystemObject в платформа.NET Framework. Так как FileSystemObject является компонентом модели компонентных объектов (COM), платформа.NET Framework требуется доступ к объекту через уровень взаимодействия. Платформа.NET Framework создает оболочку для компонента для вас, если вы хотите использовать его. Тем не менее, файл класса, класс FileInfo , каталог, DirectoryInfo классы и другие классы в платформа.NET Framework, предоставляют функциональные возможности, не доступные для объектов файловой системы, одновременно снижая издержки Слой взаимодействия.

Требования

В следующем списке представлены: рекомендуемое оборудование, программное обеспечение, сетевые требования и пакеты обновления, которые требуются:
  • Visual C++ .NET и Visual C++ 2005

Продемонстрированный операций ввода-вывода

Примеры в этой статье описаны основные файловых операций ввода-вывода. В разделе «Пример Step-by-Step» описывается создание учебной программы, демонстрирует следующие шесть операций ввода-вывода:
  • Считывание текстового файла
  • Запись в текстовый файл
  • Просмотр информации в файле
  • Список дисков
  • Список папок
  • Список файлов

Считывание текстового файла

В следующем примере кода используется класс StreamReader для чтения текстового файла. Содержимое файла добавляются в элемент управления ListBox . Блок try... catch используется для оповещения программы, если он пуст. Существует множество способов, чтобы определить, когда достигнут конец файла; в этом примере используется метод 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++ 2005 необходимо добавить общий язык среды выполнения поддержки параметр компилятора (/clr:oldsyntax/CLR: oldSyntax) для успешной компиляции фрагменте кода управляемого C++. Чтобы добавить общий параметр компилятора поддержки среды выполнения языка, выполните следующие действия.

  1. Выберите проекти нажмите кнопку

    Свойства : имя_проекта .



    Примечание. Имя_проекта — это имя проекта.
  2. Разверните узел Свойства конфигурации, а затем нажмите кнопку

    Общие.

  3. В области справа щелкните, чтобы выбрать Поддержка Common Language Runtime, старый синтаксис (/ CLR: oldSyntax) в

    Общеязыковая среда выполнения поддерживает параметры проекта.
  4. Нажмите кнопку

    Применитьи нажмите кнопку ОК.

Дополнительные сведения о вариантах поддержки компилятора общий язык среды выполнения посетите следующий веб-узел Microsoft Developer Network (MSDN):

Запись в текстовый файл

Этот пример кода использует класс StreamWriter для создания и записи в файл. Если имеется существующий файл, можно открыть его таким же образом.
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);

Просмотр информации в файле

Этот пример кода использует класс FileInfo для доступа к свойствам файлов. В этом примере используется Notepad.exe. Свойства отображаются в элементе управления 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()) );

Список дисков

Этот пример кода использует классы каталогов и дисков для логических дисков в системе. В данном примере результаты отображаются в элементе управления 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]);
}

Список подпапок

Этот пример кода использует метод GetDirectories класса Directory для получения списка папок.
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]);
}

Список файлов

Этот пример кода использует метод GetFiles класса Directory для получения списка файлов.
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]);
}
Многое может пойти не так, когда пользователь получает доступ к файлам. Файлы не существует, файл может быть занят или пользователи могут не иметь права на файлы из папок, которые пытаются получить доступ к. При написании кода обработки исключений, которые могут быть созданы, рассмотрите следующие возможности.

Пример с пошаговыми инструкциями

  1. Запустите Microsoft Visual Studio .NET, Microsoft Visual Studio 2005 или Microsoft Visual C++ 2005 Express Edition.
  2. В меню файл укажите на пункт
    Создатьи выберите команду проект.
  3. В области Типы проектоввыберите
    Проекты visual C++. В разделе Шаблоны щелкните
    Приложение Windows Forms (.NET).

    Примечание. В Visual Studio 2005 нажмите кнопку
    В области типы проектов visual C++ . В области Шаблонывыберите пункт
    Приложение Windows Forms.
  4. Введите KB307398 в
    Имя введите в C:\
    Расположение и нажмите кнопку
    ОК.
  5. Откройте форму Form1 в режиме конструктора и нажмите клавишу F4, чтобы открыть окно «Propertries».
  6. В окне «Свойства» разверните папку размер. В поле Ширина введите 700. В поле Высота введите
    320.
  7. Добавьте элемент управления ListBox и шесть
    Элемента управления Button в форму Form1.

    Примечание. Для просмотра панели инструментов, нажмите кнопку панели инструментов в меню Вид .
  8. В окне «Свойства» измените
    Местоположение, имя, размер,
    TabIndexи свойства текста этих элементов управления, как показано ниже:
    Идентификатор элемента управленияРасположениеИмяРазмерTabIndexТекст
    button1500, 32button1112, 231Чтение текстового файла
    button2500, 64button2112, 232Запись в текстовый файл
    button3500, 96button3112, 233Просмотр информации в файле
    button4500, 128button4112, 234Список дисков
    button5500, 160button5112, 235Список подпапок
    button6500, 192button6112, 236Список файлов
    listBox124, 24listBox1450, 2000listBox1
  9. Откройте файл Form1.h. В объявлении класса Form1 объявите одной закрытой переменной строки с помощью следующего кода:
    private:
    String *windir;
  10. В конструкторе класса Form1 добавьте следующий код:
    windir = System::Environment::GetEnvironmentVariable("windir");
  11. Для выполнения операций ввода вывода файла добавьте пространство имен System::IO.
  12. Нажмите клавиши SHIFT + F7, чтобы открыть форму Form1 в режиме конструктора. Дважды щелкните кнопку Чтение текстового файла и вставьте следующий код:

    Примечание. В Visual C++ 2005 в меню Вид нажмите кнопку Конструктор .
    // 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 дважды нажмите кнопку Запись текстового файла и вставьте следующий код:
    // 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 дважды щелкните кнопку Просмотр информации в файле и вставьте следующий код в метод:
    // 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 дважды щелкните кнопку Список дисков и вставьте следующий код:
    // 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 дважды щелкните кнопку Список вложенных папок и вставьте следующий код:
    // 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 дважды щелкните кнопку Список файлов и вставьте следующий код:
    // 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. Построить и запустить программу, нажмите сочетание клавиш CTRL + F5.

Полный пример кода

Примечание. При работе в Visual C++ 2005 необходимо изменить следующий код.
//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;
}

Ссылки


Для получения дополнительных сведений посетите следующий веб-узел корпорации Майкрософт:Дополнительные сведения о создании форм Windows forms в управляемые расширения для C++ содержатся в разделе Пример «ManagedCWinFormWiz» в справке Visual Studio .NET.