Faça E/S de arquivo básico no Visual C++
Este artigo descreve como fazer operações básicas de E/S (entrada/saída) de arquivo no Microsoft Visual C++ ou no Visual C++ .NET.
Versão original do produto: Visual C++
Número original do KB: 307398
Resumo
Se você não estiver familiarizado com o .NET Framework, descobrirá que o modelo de objeto para operações de arquivo no .NET Framework é semelhante ao FileSystemObject
que é popular entre muitos desenvolvedores do Visual Studio.
Para facilitar a transição, consulte Como usar FileSystemObject com o Visual Basic.
Para obter uma versão do Visual C# .NET deste artigo, consulte Como fazer E/S de arquivo básica no Visual C#.
Este artigo refere-se aos seguintes namespaces da Biblioteca de Classes do .NET Framework:
System::ComponentModel
System::Windows::Forms
System::Drawing
Você ainda pode usar o FileSystemObject
no .NET Framework. Como o FileSystemObject
é um componente COM (Component Object Model), o .NET Framework requer que o acesso ao objeto seja por meio da camada de interoperabilidade. O .NET Framework gera um wrapper para o componente para você, se você quiser usá-lo. No entanto, a File
classe, a FileInfo
classe, as Directory
classes , DirectoryInfo
e outras classes relacionadas no .NET Framework oferecem funcionalidade que não está disponível com o FileSystemObject
, sem a sobrecarga da camada de interoperabilidade.
Operações de E/S de arquivo demonstradas
Os exemplos neste artigo descrevem operações básicas de E/S de arquivo. A seção Exemplo passo a passo descreve como criar um programa de exemplo que demonstra as seguintes seis operações de E/S de arquivo:
- Ler um arquivo de texto
- Escreva um arquivo de texto
- Exibir informações do arquivo
- Listar unidades de disco
- Listar subpastas
- Listar arquivos
Ler um arquivo de texto
O código de exemplo a seguir usa uma StreamReader
classe para ler um arquivo de texto. O conteúdo do arquivo é adicionado a um controle ListBox. O try...catch
bloco é usado para alertar o programa se o arquivo estiver vazio. Há muitas maneiras de determinar quando o final do arquivo é atingido; Este exemplo usa o Peek
método para examinar a próxima linha antes de lê-la.
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);
}
No Visual C++, você deve adicionar a opção do compilador de suporte ao Common Language Runtime (/clr:oldSyntax) para compilar com êxito o exemplo de código anterior como C++ gerenciado. Para adicionar a opção do compilador de suporte ao Common Language Runtime, siga estas etapas:
Clique em Projeto e, em seguida, clique em< Propriedades do NomeDoProjeto>.
Observação
<ProjectName> é um espaço reservado para o nome do projeto.
Expanda Propriedades de Configuração e clique em Geral.
No painel direito, clique para selecionar Suporte ao Common Language Runtime, Sintaxe Antiga (/clr:oldSyntax) nas configurações do projeto de suporte ao Common Language Runtime.
Clique em Aplicar e em OK.
Escreva um arquivo de texto
Este código de exemplo usa uma StreamWriter
classe para criar e gravar em um arquivo. Se você tiver um arquivo existente, poderá abri-lo da mesma maneira.
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);
Exibir informações do arquivo
Este código de exemplo usa uma FileInfo
classe para acessar as propriedades de um arquivo. Notepad.exe é usado neste exemplo. As propriedades aparecem em um controle 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()));
Listar unidades de disco
Este código de exemplo usa as Directory
classes and Drive
para listar as unidades lógicas em um sistema. Para este exemplo, os resultados aparecem em um controle 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]);
}
Listar subpastas
Este código de exemplo usa o GetDirectories
Directory
método da classe para obter uma lista de pastas.
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]);
}
Listar arquivos
Este código de exemplo usa o GetFiles
Directory
método da classe para obter uma listagem de arquivos.
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]);
}
Muitas coisas podem dar errado quando um usuário obtém acesso aos arquivos. Os arquivos podem não existir, os arquivos podem estar em uso ou os usuários podem não ter direitos sobre os arquivos das pastas que estão tentando acessar. Considere essas possibilidades ao escrever código para lidar com as exceções que podem ser geradas.
Exemplo passo a passo
Inicie o Visual Studio .NET.
No menu Arquivo , aponte para Novoe clique em Projeto.
Em Tipos de Projeto, clique em Projetos do Visual C++. Na seção Modelos, clique em Aplicativo Windows Forms (.NET).
Digite KB307398 na caixa Nome , digite
C:\
na caixa Local e clique em OK.Abra o formulário Form1 no modo Design e pressione F4 para abrir a janela Propriedades .
Na janela Propriedades, expanda a pasta Tamanho. Na caixa Largura, digite 700. Na caixa Altura, digite 320.
Adicione um controle ListBox e seis controles Button ao Form1.
Observação
Para exibir a caixa de ferramentas, clique em Caixa de Ferramentas no menu Exibir .
Na janela Propriedades, altere as propriedades Local, Nome, Tamanho, TabIndex e Texto desses controles da seguinte maneira:
ID do controle Localidade Nome Tamanho TabIndex Texto Botão1 500, 32 Botão1 112, 23 1 Ler arquivo de texto botão2 500, 64 botão2 112, 23 2 Gravar arquivo de texto Botão3 500, 96 Botão3 112, 23 3 Exibir Informações do Arquivo botão4 500, 128 botão4 112, 23 4 Listar unidades botão5 500, 160 botão5 112, 23 5 Listar subpastas botão6 500, 192 botão6 112, 23 6 Listar arquivos listBox1 24, 24 listBox1 450, 200 0 listBox1 Abra o arquivo Form1.h . Na declaração de
Form1
classe, declare uma variável privadaString
com o seguinte código:private: String *windir;
No construtor de
Form1
classe, adicione o seguinte código:windir = System::Environment::GetEnvironmentVariable("windir");
Para executar operações de entrada e saída de arquivo, adicione o
System::IO
namespace.Pressione SHIFT+F7 para abrir o Form1 no modo Design. Clique duas vezes no botão Ler Arquivo de Texto e cole o seguinte código:
// 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); }
No modo Design Form1, clique duas vezes no botão Gravar Arquivo de Texto e cole o seguinte código:
// 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);
No modo Design Form1, clique duas vezes no botão Exibir Informações do Arquivo e cole o seguinte código no método:
// 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()));
No modo Design Form1, clique duas vezes no botão Listar Unidades e cole o seguinte código:
// 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]); }
No modo Design Form1, clique duas vezes no botão Listar Subpastas e cole o seguinte código:
// 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]); }
No modo Design Form1, clique duas vezes no botão Listar Arquivos e cole o seguinte código:
// 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]); }
Para compilar e executar o programa, pressione CTRL+F5.
Exemplo de código completo
//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;
}
Referências
Para obter mais informações, visite o Suporte da Microsoft. Para obter mais informações sobre como criar formulários do Windows em extensões gerenciadas para C++, consulte o exemplo na Ajuda do ManagedCWinFormWiz
Visual Studio .NET.