Estás trabajando sin conexión, espera a que vuelva la conexión a Internet

Cómo realizar operaciones básicas de E/S de archivos en Visual C++ 2005 o en Visual C++ .NET

Este artículo se publicó anteriormente con el número E307398
Para obtener una versión de este artículo para Microsoft Visual C# .NET, vea 304430.
Para obtener una versión de este artículo para Microsoft Visual Basic .NET, vea 304427.
Este artículo hace referencia a los siguientes espacios de nombres de la 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 de entrada/salida de archivos en Microsoft Visual C++ 2005 o en Microsoft Visual C++ .NET. Si aún no conoce .NET Framework, encontrará que su modelo de objetos para las operaciones de archivos es similar al de FileSystemObject (FSO) que usan mucho los desarrolladores de Microsoft Visual Studio 6.0. En un esfuerzo por 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
Puede seguir usando FileSystemObject en .NET Framework. Puesto que FileSystemObject es un componente del Modelo de objetos componentes (COM, Component Object Model), .NET Framework requiere que el acceso al objeto se realice a través del nivel Interop. .NET Framework genera un contenedor para el componente, si desea usarlo. Sin embargo, las clases File, FileInfo, Directory, DirectoryInfo y otras relacionadas en .NET Framework ofrecen una funcionalidad que no está disponible con FSO, sin la sobrecarga de trabajo que supone el nivel Interop.

Requisitos

En la lista siguiente se describen el hardware, el software, la infraestructura de red y los Service Packs requeridos:
  • Visual C++ 2005 o Visual C++ .NET

Demostración de operaciones de E/S de archivos

Los ejemplos de este artículo describen operaciones básicas de E/S de archivos. En la sección "Ejemplo paso a paso" se describe cómo crear un programa de ejemplo que demuestre las seis operaciones de E/S de archivos siguientes:
  • Leer un archivo de texto
  • Escribir en un archivo de texto
  • Ver información de un archivo
  • Enumerar unidades de disco
  • Enumerar carpetas
  • Enumerar archivos

Leer un archivo de texto

En el ejemplo de código siguiente se utiliza una clase StreamReader para leer el archivo System.ini. 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 varias formas de determinar cuándo se llega al final del archivo; en este ejemplo se 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 del compilador de compatibilidad con Common Language Runtime (/clr:oldSyntax) para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador con compatibilidad con Common Language Runtime, siga estos pasos:
  1. Haga clic en Proyecto y haga clic en Propiedades de NombreDeProyecto.

    Observe que NombreDeProyecto es un marcador de posición del nombre del proyecto.
  2. Expanda Propiedades de configuración y haga clic en General.
  3. En el panel derecho, seleccione Compatible con Common Language Runtime, Sintaxis antigua (/clr:oldSyntax) en la configuración del proyecto Compatible con Common Language Runtime.
  4. Haga clic en Aplicar y en Aceptar.
Para obtener más información acerca de las opciones del compilador con compatibilidad con Common Language Runtime, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):

Escribir en un archivo de texto

En este ejemplo de código se usa una clase StreamWriter para crear y escribir en un archivo. Si tiene un archivo, 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 un archivo

En este ejemplo de código se usa una clase FileInfo para tener acceso a las propiedades de un archivo. En este ejemplo se utiliza Notepad.exe. Las propiedades se muestran 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

En este ejemplo de código se utilizan las clases Directory y Drive para enumerar las unidades lógicas de un sistema. En este ejemplo, los resultados se muestran 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]);  } 				

Mostrar subcarpetas

En este ejemplo de código se usa 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]);}				

Mostrar archivos

En este ejemplo de código se usa 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 los archivos, pueden surgir muchos problemas. Los archivos pueden no existir o estar siendo utilizados, o los usuarios pueden no tener derechos en los archivos o carpetas a los que intentan tener acceso. Considere estas posibilidades cuando escriba código que controle las excepciones que se puedan generar.

Ejemplo paso a paso

  1. Inicie Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET 2003.
  2. En el menú Archivo, seleccione Nuevo y 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 Q307398 en el cuadro Nombre, escriba C:\ en el cuadro Ubicación y haga clic en Aceptar.
  5. Abra el formulario Form1 en la vista Diseño y presione F4 para abrir la ventana Propiedades.
  6. En la ventana Propiedades, expanda la carpeta Tamaño. En el cuadro Ancho, escriba 700. En el cuadro Alto, escriba 320.
  7. Agregue un control ListBox y seis controles Button 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 las propiedades Location, Name, Size, TabIndex y Text de estos controles como se indica a continuación:
    Id. de controlUbicaciónNombreTamañoTabIndexText
    button1500, 32button1112, 231Leer archivo de texto
    button2500, 64button2112, 232Escribir archivo de texto
    button3500, 96button3112, 233Ver información de un archivo
    button4500, 128button4112, 234Enumerar unidades
    button5500, 160button5112, 235Mostrar subcarpetas
    button6500, 192button6112, 236Enumerar archivos
    listBox124, 24listBox1450, 2000listBox1
  9. Abra el archivo Form1.h. En la declaración de la clase Form1, declare una variable String privada 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 entrada y salida de archivos, agregue el espacio de nombres System.IO.
  12. Presione MÁYUS+F7 para abrir Form1 en la vista Diseño. Haga doble clic en Abrir archivo de texto y pegue el código siguiente:
    // 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 Escribir archivo de texto y 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 Escribir archivo de texto, haga doble clic en Ver información de un archivo y 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 Ver información de un archivo y 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 Enumerar subcarpetas y 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 Enumerar archivos y 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 ejecutar después el programa, presione CTRL+F5.

Ejemplo de código completo

//Form1.h#pragma oncenamespace Q307398{	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 My;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 al respecto, visite el siguiente sitio Web de Microsoft: Para obtener más información acerca de Visual C++ .NET, visite el siguiente grupo de noticias de Microsoft Usenet: Para obtener más información acerca de cómo crear formularios de Windows 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: 02/22/2007 19:06:22 - Revisión: 3.0

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard

  • kbwindowsforms kbforms kbio kbfileio kbhowtomaster kbnewsgrouplink KB307398
Comentarios
g style="display: none; " src="https://c1.microsoft.com/c.gif?DI=4050&did=1&t=">l
Paraguay - Español
Venezuela - Español
://c1.microsoft.com/c.gif?DI=4050&did=1&t=">ent.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?"> >>