HOW TO: Eseguire operazioni di I/O di base sui file in Visual C++ .NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I307398
Sommario
Nella procedura dettagliata riportata in questo articolo viene spiegato come eseguire sei operazioni di input/output (I/O) di base sui file in Visual C++ .NET. Se non si conosce l'ambiente .NET, si noterà che il modello di oggetti per operazioni sui file disponibile in .NET è molto simile all'oggettoFileSystemObject(FSO), noto a molti sviluppatori di Visual Studio 6.0. Per rendere più agevole questa transizione, la funzionalità qui illustrata si basa sul seguente articolo della Knowledge Base (gli articoli con prefisso "Q" contengono informazioni in inglese):
186118 HOWTO: Use FileSystemObject with Visual Basic
È sempre possibile utilizzare l'oggettoFileSystemObjectnell'ambiente .NET. PoichéFileSystemObjectè un componente COM (Component Object Model), l'accesso all'oggetto in ambiente .NET deve essere effettuato tramite il livello Interop. In ambiente .NET viene generato automaticamente un wrapper per il componente se si sceglie di utilizzarlo. Tuttavia, le classiFile,FileInfo,DirectoryeDirectoryInfo, nonché tutte le altre classi correlate in .NET Framework, offrono funzionalità non disponibili con l'oggetto FSO, senza il sovraccarico del livello Interop.

Negli esempi riportati in questo articolo vengono descritte operazioni di I/O di base sui file. Nella sezione "Procedura di esempio" viene spiegato come creare un'applicazione di esempio per la dimostrazione di queste operazioni.

Torna all'inizio

Lettura di un file di testo

Nel codice di esempio qui riportato si utilizza la classeStreamReaderper leggere il file System.ini. Il contenuto del file viene aggiunto a un controlloListBox. Il bloccotry...catchviene utilizzato per visualizzare un avviso nel caso in cui il file non contenga dati. Sono disponibili vari modi per determinare la fine del file; nel codice viene utilizzato il metodoPeekper esaminare la riga successiva prima che venga letta.
  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);	}}
Torna all'inizio

Scrittura di un file di testo

Nel codice di esempio qui riportato si utilizza la classeStreamWriterper creare e scrivere in un file. Se è disponibile un file esistente, è possibile aprirlo nello stesso modo.
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);
Torna all'inizio

Visualizzazione delle informazioni sul file

Nel codice di esempio qui riportato si utilizza la classeFileInfoper accedere alle proprietà di un file. Nell'esempio viene utilizzato il file Notepad.exe. Le proprietà vengono visualizzate in un controlloListBox.
 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()) );
Torna all'inizio

Visualizzazione dell'elenco delle unità disco

Nel codice di esempio qui riportato si utilizzano le classiDirectoryeDriveper fornire un elenco delle unità logiche di un sistema. I risultati sono visualizzati in un controlloListBox.
  listbox1->Items->Clear();  String* drives[] = Directory::GetLogicalDrives();  int numDrives = drives->get_Length();  for (int i=0; i<numDrives; i++)  {	listbox1->Items->Add(drives[i]);  } 
Torna all'inizio

Visualizzazione dell'elenco delle cartelle

Nel codice di esempio qui riportato si utilizza il metodoGetDirectoriesdella classeDirectoryper visualizzare l'elenco delle cartelle.
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]);}
Torna all'inizio

Visualizzazione dell'elenco dei file

Nel codice di esempio qui riportato si utilizza il metodoGetFilesdella classeDirectoryper visualizzare l'elenco dei file.
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]);}
Quando un utente accede ai file possono verificarsi diversi tipi di errore. È possibile che i file non esistano o che siano in uso oppure che gli utenti non dispongano delle autorizzazioni per i file o le cartelle a cui desiderano accedere. È importante considerare tutte queste possibilità quando si scrive il codice in modo da poter gestire le eventuali eccezioni generate.

Torna all'inizio

Procedura di esempio

  1. In Visual C++ .NET creare una nuova applicazione di C++ gestito.
  2. Aprire la finestra del codice per<NomeProgetto>.cpp.
  3. Eliminare tutto il codice.
  4. Incollare il codice seguente in<NomeProgetto>.cpp:
    #using <mscorlib.dll>using namespace System;using namespace System::IO;// required dlls for WinForms#using "System.dll"#using "System.Windows.Forms.dll"#using "System.Drawing.dll"// required namespaces for WinFormsusing namespace System::ComponentModel;using namespace System::Windows::Forms;using namespace System::Drawing;__gc class WinForm: public Form {private:			Button	    *button1;	Button	    *button2;	Button	    *button3;	Button	    *button4;	Button	    *button5;	Button	    *button6;	String*     windir;	ListBox     *listbox1;	String	    *caption;	// Caption of the WinForm	int	    width;		// width of the WinForm	int	    height;		// height of the WinFormpublic:	WinForm() 	{		// Set caption and size of the WinForm		caption = "Form1";		width = 360;		height = 273;		windir=System::Environment::GetEnvironmentVariable("windir");		InitForm();	}	void Dispose()	{	// Form is being destroyed.  Do any necessary clean-up here.		Form::Dispose();	}void InitForm(){		// Setup controls here		// Basic WinForm Settings			SuspendLayout();		// button1		//                 button1 = new Button();		button1->Text = "button1";		button1->Name = "button1";		button1->Size = Drawing::Size(112, 23);		button1->TabIndex = 1;		button1->Location = Drawing::Point(216,32);		button1->Click += (new EventHandler(this,                                       &WinForm::button1_Click));		Controls->Add(button1);		// button2		// 		button2 = new Button();		button2->Text = "button2";		button2->Name = "button2";		button2->Size = Drawing::Size(112, 23);		button2->TabIndex = 2;		button2->Location = Drawing::Point(216,64);		button2->Click += (new EventHandler(this,                                   &WinForm::button2_Click));		Controls->Add(button2);				// button3		// 		button3 = new Button();		button3->Text = "button3";		button3->Name = "button3";		button3->Size = Drawing::Size(112, 23);		button3->TabIndex = 3;		button3->Location = Drawing::Point(216,96);		button3->Click += (new EventHandler(this,                                   &WinForm::button3_Click));		Controls->Add(button3);		// listbox1		// 		listbox1 = new ListBox();		listbox1->Text = "Listbox1";		listbox1->Name = "Listbox1";		listbox1->Size = Drawing::Size(176, 199);		listbox1->TabIndex = 0;		listbox1->Location = Drawing::Point(24,24);		Controls->Add(listbox1);					// 		// button4		// 		button4 = new Button();		button4->Text = "button4";		button4->Name = "button4";		button4->Size = Drawing::Size(112, 23);		button4->TabIndex = 4;		button4->Location = Drawing::Point(216,128);		button4->Click += (new EventHandler(this,                                    &WinForm::button4_Click));		Controls->Add(button4);		// button5		// 		button5 = new Button();		button5->Text = "button5";		button5->Name = "button5";		button5->Size = Drawing::Size(112, 23);		button5->TabIndex = 5;		button5->Location = Drawing::Point(216,160);		button5->Click += (new EventHandler(this,                                   &WinForm::button5_Click));		Controls->Add(button5);		// button6		// 		button6 = new Button();		button6->Text = "button6";		button6->Name = "button6";		button6->Size = Drawing::Size(112, 23);		button6->TabIndex = 6;		button6->Location = Drawing::Point(216,192);		button6->Click += (new EventHandler(this,                                   &WinForm::button6_Click));		Controls->Add(button6);		Text = caption;		Size = System::Drawing::Size(width, height);			Name = "Form1";		Text = "Form1";		Load += new System::EventHandler(this, Form1_Load);		ResumeLayout(false);}void button6_Click(Object *sender, EventArgs *e){//how to obtain list of files (example uses 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]);	}}void button1_Click(Object *sender, EventArgs *e){//how to read a text file//try...catch is to deal with a 0 byte file or non-existant file	listbox1->Items->Clear();   	try   	{    	    String* textFile = String::Concat(windir,                                             ("\\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);	}} void Form1_Load(Object *sender, EventArgs *e){	button1->Text = "Read Text File";	button2->Text = "Write Text File";	button3->Text = "View File Information";	button4->Text = "List Drives";	button5->Text = "List Subfolders";	button6->Text = "List Files";}void button5_Click(Object *sender, EventArgs *e){         //how to get a list of folders (example uses 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]);                                                      	}}void button4_Click(Object *sender, EventArgs *e){//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]);	}}void button3_Click(Object *sender, EventArgs *e){   //how to retrieve file properties (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()) );}      void button2_Click(Object *sender, EventArgs *e){//demonstrates how to create and write to a text file  StreamWriter* pwriter = new StreamWriter("c:\\KBTest.txt");  pwriter->WriteLine("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);}};void main(){	// This line creates an instance of WinForm, and 	// uses it as the Main Window of the application. 	Application::Run(new WinForm());}
  5. Fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni e scegliereProprietà. SelezionareC/C++, quindi scegliereIntestazioni precompilate.Modificare l'impostazione daCrea/Usa intestazione precompilataaSenza intestazioni precompilate, quindi salvare il progetto.
  6. Premere F5 per compilare ed eseguire l'applicazione. Fare clic sui pulsanti per verificare il funzionamento delle diverse operazioni.
Torna all'inizio

RIFERIMENTI

Per ulteriori informazioni sulla creazione di form di Windows nelle estensioni gestite per Visual C++, vedere l'esempio "ManagedCWinFormWiz" nella Guida di Visual Studio .NET.

Visitare il centro di supporto per Visual C++ .NET facendo clic sul collegamento seguente (informazioni in lingua inglese):

Torna all'inizio
Proprietà

ID articolo: 307398 - Ultima revisione: 04/08/2003 22:49:00 - Revisione: 1.0

Microsoft Visual C++ .NET 2002 Standard Edition

  • kbhowto kbhowtomaster kbnewsgrouplink KB307398
Feedback