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

Traduzione articoli Traduzione articoli
Identificativo articolo: 307398 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I307398
Espandi tutto | Chiudi tutto

In questa pagina

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'oggetto FileSystemObject (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'oggetto FileSystemObject nell'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 classi File, FileInfo, Directory e DirectoryInfo, 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.

Lettura di un file di testo

Nel codice di esempio qui riportato si utilizza la classe StreamReader per leggere il file System.ini. Il contenuto del file viene aggiunto a un controllo ListBox. Il blocco try...catch viene 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 metodo Peek per 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);
	}

}

Scrittura di un file di testo

Nel codice di esempio qui riportato si utilizza la classe StreamWriter per 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);

Visualizzazione delle informazioni sul file

Nel codice di esempio qui riportato si utilizza la classe FileInfo per accedere alle proprietÓ di un file. Nell'esempio viene utilizzato il file Notepad.exe. Le proprietÓ vengono visualizzate in un controllo 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()) );

Visualizzazione dell'elenco delle unitÓ disco

Nel codice di esempio qui riportato si utilizzano le classi Directory e Drive per fornire un elenco delle unitÓ logiche di un sistema. I risultati sono visualizzati in un controllo 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]);
  } 

Visualizzazione dell'elenco delle cartelle

Nel codice di esempio qui riportato si utilizza il metodo GetDirectories della classe Directory per 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]);
}

Visualizzazione dell'elenco dei file

Nel codice di esempio qui riportato si utilizza il metodo GetFiles della classe Directory per 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.

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 WinForms
    using 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 WinForm
    
    public:
    	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 scegliere ProprietÓ. Selezionare C/C++, quindi scegliere Intestazioni precompilate. Modificare l'impostazione da Crea/Usa intestazione precompilata a Senza 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.

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):
Centro di supporto per Visual C++ .NET (2002)


ProprietÓ

Identificativo articolo: 307398 - Ultima modifica: martedý 8 aprile 2003 - Revisione: 1.0
Le informazioni in questo articolo si applicano a
  • Microsoft Visual C++ .NET 2002 Standard Edition
Chiavi:á
kbhowto kbhowtomaster kbnewsgrouplink KB307398
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com