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

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):


Proprietà

ID articolo: 307398 - Ultima revisione: 08 apr 2003 - Revisione: 1

Feedback