Cómo realizar operaciones de E/S de archivo básico en Visual C++ o en Visual C++ .NET

Para un Microsoft Visual C++ .NET 2005/2008 ECMA c++ / CLI versión de este artículo, consulte 950617 .

Para una versión de Microsoft Visual C# .NET de este artículo, consulte
304430 .
Para una versión de Microsoft Visual Basic .NET de este artículo, consulte
304427 .
En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System::ComponentModel
  • System::Windows::Forms
  • System::Drawing

Resumen

En este artículo paso a paso se describe cómo realizar seis operaciones básicas archivos entrada/salida (E/S) en Microsoft Visual C++ 2005 o en Microsoft Visual C++. NET. Si está familiarizado con el.NET Framework, encontrará que el modelo de objetos para las operaciones de archivos en el.NET Framework es similar a FileSystemObject (FSO), que es muy popular con muchos desarrolladores de Microsoft Visual Studio 6.0. Para facilitar la transición, la funcionalidad que se demuestra en este artículo se basa en el siguiente artículo de Microsoft Knowledge Base:
186118 cómo utilizar FileSystemObject con Visual Basic

Todavía puede utilizar FileSystemObject en el.NET Framework. Porque FileSystemObject es un componente del modelo de objetos componentes (COM), el de.NET Framework requiere que el acceso al objeto sea a través de la capa de interoperabilidad. El.NET Framework genera un contenedor para el componente si desea utilizarlo. Sin embargo, la clase File , la clase FileInfo , Directory, DirectoryInfo clases y otras clases relacionadas de.NET Framework, ofrecen funcionalidad que no está disponible con el FSO sin la sobrecarga de la capa de interoperabilidad.

Requisitos

La lista siguiente describe el hardware recomendado, software, infraestructura de red y service packs que se necesitan:
  • Visual C++ 2005 o en Visual C++ .NET

Operaciones de E/S de archivo demostradas

Los ejemplos de este artículo describen operaciones de E/S de archivo básico. La sección "Ejemplo paso a paso" describe cómo crear un programa de ejemplo que demuestra las siguientes operaciones de E/S de seis archivo:
  • Leer un archivo de texto
  • Escribir un archivo de texto
  • Ver información de archivo
  • Enumerar unidades de disco
  • Carpetas de la lista
  • Archivos de la lista

Leer un archivo de texto

El código de ejemplo siguiente utiliza una clase StreamReader para leer un archivo de texto. El contenido del archivo se agrega a un control ListBox . El bloque try... catch se utiliza para avisar al programa si el archivo está vacío. Hay muchas formas de determinar cuándo se llega al final del archivo; Este ejemplo utiliza el método Peek para examinar la línea siguiente antes de leerla.
  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);
}

}

Nota: En Visual C++ 2005, debe agregar la opción common language runtime compatibilidad con compilador (/clr:oldsyntax/clr: oldSyntax) para compilar correctamente el ejemplo de código anterior como C++ administrado. Para agregar la opción de compilador de common language runtime soporte, siga estos pasos:

  1. Haga clic en proyectoy, a continuación, haga clic en

    Propiedades de NombreProyecto .



    Nota: NombreDeProyecto es un marcador de posición para el nombre del proyecto.
  2. Expanda Propiedades de configuracióny, a continuación, haga clic en

    General.

  3. En el panel derecho, haga clic en soporte de Common Language Runtime, sintaxis antigua (/ CLR: oldSyntax) en el

    Configuración de proyecto compatibilidad con Common Language Runtime .
  4. Haga clic en

    Aplicary, a continuación, haga clic en Aceptar.

Para obtener más información acerca de las opciones del compilador compatibilidad con Common language runtime, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

Escribir un archivo de texto

Este ejemplo de código utiliza una clase StreamWriter para crear y escribir en un archivo. Si tiene un archivo existente, puede abrirlo de la misma manera.
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);

Ver información de archivo

Este ejemplo de código utiliza una clase FileInfo para tener acceso a propiedades de un archivo. En este ejemplo se utiliza Notepad.exe. Las propiedades aparecen en un control 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()) );

Enumerar unidades de disco

Este código de ejemplo utiliza las clases del directorio y la unidad para enumerar las unidades lógicas de un sistema. Para este ejemplo, los resultados aparecen en un control 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]);
}

Enumerar subcarpetas

Este código de ejemplo utiliza el método GetDirectories de la clase Directory para obtener una lista de carpetas.
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]);
}

Archivos de la lista

Este código de ejemplo utiliza el método GetFiles de la clase Directory para obtener una lista de archivos.
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]);
}

Cuando un usuario obtiene acceso a archivos, pueden surgir muchos problemas. Los archivos pueden no existir, los archivos pueden estar en uso o los usuarios pueden no tener derechos en los archivos de las carpetas que intenta obtener acceso. Considere estas posibilidades cuando escriba código para controlar las excepciones que pueden generarse.

Ejemplo paso a paso

  1. Inicie Microsoft Visual Studio. NET, Microsoft Visual Studio 2005 o Microsoft Visual C++ 2005 Express Edition.
  2. En el menú archivo , elija
    De nuevoy, a continuación, haga clic en proyecto.
  3. En Tipos de proyecto, haga clic en
    Proyectos de visual C++. En la sección plantillas , haga clic en
    Aplicación de Windows Forms (. NET).

    Nota: En Visual Studio 2005, haga clic en
    Visual C++ en tipos de proyecto. En plantillas, haga clic en
    Aplicación de Windows Forms.
  4. Escriba KB307398 en el
    Nombre , escriba C:\ en el
    Cuadro de ubicación y, a continuación, haga clic en
    OK.
  5. Abra el formulario Form1 en la vista Diseño y, a continuación, presione F4 para abrir la ventana Propiedades.
  6. En la ventana Propiedades, expanda la carpeta de tamaño. En el cuadro ancho , escriba 700. En el cuadro alto , escriba
    320.
  7. Agregar un control ListBox y seis
    Controles de botón a Form1.

    Nota: Para ver el cuadro de herramientas, haga clic en cuadro de herramientas en el menú Ver .
  8. En la ventana Propiedades, cambie el
    Ubicación, el nombre, el tamaño, el
    TabIndexy las propiedades Text de estos controles como sigue:
    Identificador de controlUbicaciónNombreTamañoTabIndexTexto
    button1500, 32button1112, 231Leer archivo de texto
    button2500, 64button2112, 232Escribir archivo de texto
    button3500, 96button3112, 233Ver información de archivo
    button4500, 128button4112, 234Enumerar unidades
    button5500, 160button5112, 235Enumerar subcarpetas
    button6500, 192button6112, 236Archivos de la lista
    listBox124, 24listBox1450, 2000listBox1
  9. Abra el archivo Form1.h. En la declaración de clase Form1 , declare una variable privada de cadena con el código siguiente:
    private:String *windir;
  10. En el constructor de la clase Form1 , agregue el código siguiente:
    windir = System::Environment::GetEnvironmentVariable("windir");
  11. Para realizar operaciones de salida de entrada de archivo, agregue el espacio de nombres System::IO.
  12. Presione MAYÚS + F7 para abrir Form1 en la vista Diseño. Haga doble clic en el botón Leer archivo de texto y, a continuación, pegue el código siguiente:

    Nota: En Visual C++ 2005, haga clic en Diseñador en el menú Ver .
    // 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. En la vista Diseño de Form1, haga doble clic en el botón Escribir archivo de texto y, a continuación, pegue el código siguiente:
    // 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. En la vista Diseño de Form1, haga doble clic en el botón Ver información de archivo y, a continuación, pegue el código siguiente en el 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()) );
  15. En la vista Diseño de Form1, haga doble clic en el botón de Lista de unidades y, a continuación, pegue el código siguiente:
    // 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. En la vista Diseño de Form1, haga doble clic en el botón Lista de subcarpetas y, a continuación, pegue el código siguiente:
    // 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. En la vista Diseño de Form1, haga doble clic en el botón de Lista de archivos y, a continuación, pegue el código siguiente:
    // 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. Para generar y, a continuación, ejecute el programa, presione CTRL+F5.

Ejemplo de código completo

Nota: Debe cambiar el código siguiente cuando se ejecuta en 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;
}

Referencias

Para obtener más información, visite el siguiente sitio Web de Microsoft:Para obtener más información acerca de cómo crear formularios Windows forms en Extensiones administradas para C++, vea el ejemplo "ManagedCWinFormWiz" en la Ayuda de Visual Studio. NET.
Propiedades

Id. de artículo: 307398 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios