Come effettuare ricerche ricorsive all'interno delle directory mediante Visual C#

Traduzione articoli Traduzione articoli
Identificativo articolo: 303974 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato precedentemente pubblicato con il codice di riferimento I303974
Per la versione di questo articolo relativa a Microsoft Visual C++ .NET vedere: 307009.
Per la versione di questo articolo relativa a Microsoft Visual Basic .NET, vedere 306666.

Questo articolo si riferisce al seguente spazio dei nomi della libreria di classi di Microsoft .NET Framework:
  • System.IO
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene illustrato in dettaglio come effettuare ricerche ricorsive di file nelle sottodirectory in un'applicazione C# Windows Forms. Viene specificata una stringa di ricerca in modo da individuare i file che corrispondono a criteri caratteri jolly. Le singole parti del codice vengono illustrate a seconda dei casi. Nella parte finale dell'articolo è inoltre riportato un esempio di codice funzionante.

La ricorsione delle directory è un'operazione di I/O utilizzata di frequente dagli sviluppatori. FileSystemObject semplifica questa attività per le applicazioni COM (Component Object Model). In .NET è tuttavia divenuta ancora più agevole. Come accade per FileSystemObject, le classi nello spazio dei nomi System.IO forniscono una modalità di accesso ai file e alle directory orientata agli oggetti.

Requisiti

  • Microsoft Visual C# 2005 o Microsoft Visual C# .NET

Ricursione delle directory

Le classi di manipolazione dei file e delle directory risiedono nello spazio dei nomi System.IO. Per poter utilizzare tali classi, è opportuno importare nel progetto lo spazio dei nomi indicato di seguito:
using System.IO;
Le classi dello spazio dei nomi System.IO forniscono molte classi che consentono di utilizzare file e directory. Tali classi includono classi di file, classi di directory e classi di utilità. Molte di queste classi contengono metodi static che è possibile chiamare senza dover dichiarare una variabile di tale tipo. Ad esempio, è possibile utilizzare l'oggetto Directory per ottenere le sottodirectory di una data directory.

Nel codice riportato di seguito viene utilizzato il metodo statico GetDirectories dell'oggetto Directory per restituire una matrice di stringhe. Tale matrice contiene i nomi dei percorsi alle eventuali sottodirectory della directory C.
string[] directories = Directory.GetDirectories("C:\\");
L'oggetto Directory inoltre contiene un metodo denominato GetFiles che consente di recuperare una matrice di stringhe che soddisfa un determinato criterio. Nel codice di esempio riportato di seguito viene utilizzato l'oggetto File per recuperare tutti i file presenti nella directory C con estensione DLL:
string[] files = Directory.GetFiles("C:\\", "*.dll");
I metodi GetDirectories e GetFiles dell'oggetto Directory sono tutto ciò che server per la ricerca ricorsiva di file corrispondenti alla stringa di ricerca. Per eseguire la ricorsione, viene utilizzato il metodo riportato di seguito:
void DirSearch(string sDir) 
{
	try	
	{
	   foreach (string d in Directory.GetDirectories(sDir)) 
	   {
		foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
		{
		   lstFilesFound.Items.Add(f);
		}
		DirSearch(d);
	   }
	}
	catch (System.Exception excpt) 
	{
		Console.WriteLine(excpt.Message);
	}
}
Nel codice sopra riportato viene passata una stringa che contiene la directory in cui effettuare la ricerca a DirSearch. Il valore della stringa corrisponde al percorso completo della directory. È possibile utilizzare GetDirectories per recuperare le sottodirectory della directory passata nella procedura. Poiché GetDirectories restituisce una matrice, è possibile utilizzare un'istruzione for/each per l'iterazione in ogni sottodirectory. Utilizzare il metodo GetFiles per eseguire la nuova ricerca ricorsiva nei file di ciascuna sottodirectory. Il valore della casella di testo del modulo viene passato a GetFiles. Nella casella di testo è contenuta la stringa di ricerca che filtra i risultati restituiti da GetFiles. Gli eventuali file che corrispondono ai criteri di ricerca specificati vengono aggiunti alla casella di riepilogo. Per ciascuna sottodirectory individuata, chiamare nuovamente DirSearch e passarlo a una sottodirectory. La chiamata ricorsiva consente di effettuare la ricerca in tutte le sottodirectory di una determinata directory radice.

Codice di esempio completo

  1. Avviare un nuovo progetto di applicazione Windows in Visual C#. Per impostazione predefinita, viene creata una maschera denominata Form1.
  2. Scegliere Esplora soluzioni nel menu Visualizza.
  3. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Form1, quindi scegliere Visualizza codice.
  4. Nella finestra del codice di Form1 evidenziare e quindi eliminare tutto il codice esistente.
  5. Incollare il codice riportato di seguito nella finestra del codice di Form1.
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
    
    namespace RecursiveSearchCS
    {
        /// <summary>
        /// Summary description for Form1
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            internal System.Windows.Forms.Button btnSearch;
            internal System.Windows.Forms.TextBox txtFile;
            internal System.Windows.Forms.Label lblFile;
            internal System.Windows.Forms.Label lblDirectory;
            internal System.Windows.Forms.ListBox lstFilesFound;
            internal System.Windows.Forms.ComboBox cboDirectory;
            /// <summary>
            /// Required designer variable
            /// </summary>
            private System.ComponentModel.Container components = null;
    
            public Form1()
            {
                // 
                // Required for Windows Form Designer support
                // 
                InitializeComponent();
    
                // 
                // TODO: Add any constructor code after InitializeComponent call.
                // 
            }
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    if (components != null) 
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
            #region Windows Form Designer generated code
            /// <summary>
            /// Required method for Designer support: do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.btnSearch = new System.Windows.Forms.Button();
                this.txtFile = new System.Windows.Forms.TextBox();
                this.lblFile = new System.Windows.Forms.Label();
                this.lblDirectory = new System.Windows.Forms.Label();
                this.lstFilesFound = new System.Windows.Forms.ListBox();
                this.cboDirectory = new System.Windows.Forms.ComboBox();
                this.SuspendLayout();
                // 
                // btnSearch
                // 
                this.btnSearch.Location = new System.Drawing.Point(608, 248);
                this.btnSearch.Name = "btnSearch";
                this.btnSearch.TabIndex = 0;
                this.btnSearch.Text = "Search";
                this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
                // 
                // txtFile
                // 
                this.txtFile.Location = new System.Drawing.Point(8, 40);
                this.txtFile.Name = "txtFile";
                this.txtFile.Size = new System.Drawing.Size(120, 20);
                this.txtFile.TabIndex = 4;
                this.txtFile.Text = "*.dll";
                // 
                // lblFile
                // 
                this.lblFile.Location = new System.Drawing.Point(8, 16);
                this.lblFile.Name = "lblFile";
                this.lblFile.Size = new System.Drawing.Size(144, 16);
                this.lblFile.TabIndex = 5;
                this.lblFile.Text = "Search for files containing:";
                // 
                // lblDirectory
                // 
                this.lblDirectory.Location = new System.Drawing.Point(8, 96);
                this.lblDirectory.Name = "lblDirectory";
                this.lblDirectory.Size = new System.Drawing.Size(120, 23);
                this.lblDirectory.TabIndex = 3;
                this.lblDirectory.Text = "Look In:";
                // 
                // lstFilesFound
                // 
                this.lstFilesFound.Location = new System.Drawing.Point(152, 8);
                this.lstFilesFound.Name = "lstFilesFound";
                this.lstFilesFound.Size = new System.Drawing.Size(528, 225);
                this.lstFilesFound.TabIndex = 1;
                // 
                // cboDirectory
                // 
                this.cboDirectory.DropDownWidth = 112;
                this.cboDirectory.Location = new System.Drawing.Point(8, 128);
                this.cboDirectory.Name = "cboDirectory";
                this.cboDirectory.Size = new System.Drawing.Size(120, 21);
                this.cboDirectory.TabIndex = 2;
                this.cboDirectory.Text = "ComboBox1";
                // 
                // Form1
                // 
                this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                this.ClientSize = new System.Drawing.Size(688, 277);
                this.Controls.AddRange(new System.Windows.Forms.Control[] {
    
                this.btnSearch,
                this.txtFile,
                this.lblFile,
                this.lblDirectory,
                this.lstFilesFound,
                this.cboDirectory});
    
                this.Name = "Form1";
                this.Text = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
    
            }
            #endregion
    
            /// <summary>
            /// The main entry point for the application
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new Form1());
            }
    
            private void btnSearch_Click(object sender, System.EventArgs e)
            {
                lstFilesFound.Items.Clear();
                txtFile.Enabled = false;
                cboDirectory.Enabled = false;
                btnSearch.Text = "Searching...";
                this.Cursor = Cursors.WaitCursor;
                Application.DoEvents();
                DirSearch(cboDirectory.Text);
                btnSearch.Text = "Search";
                this.Cursor = Cursors.Default;
                txtFile.Enabled = true;
                cboDirectory.Enabled = true;
            }
    
            private void Form1_Load(object sender, System.EventArgs e)
            {
                cboDirectory.Items.Clear();
                foreach (string s in Directory.GetLogicalDrives())
                {
                    cboDirectory.Items.Add(s);
                }
                cboDirectory.Text = "C:\\";
            }
    
            void DirSearch(string sDir) 
            {
                try	
                {
                    foreach (string d in Directory.GetDirectories(sDir)) 
                    {
                        foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                        {
                            lstFilesFound.Items.Add(f);
                        }
                        DirSearch(d);
                    }
                }
                catch (System.Exception excpt) 
                {
                    Console.WriteLine(excpt.Message);
                }
            }
        }
    }
    Nota È necessario modificare il codice in Visual Studio 2005 e Visual Studio 2008. Nelle versioni di Visual Studio precedenti a Visual Studio 2005, Visual C# aggiunge una maschera al progetto quando si crea un progetto Windows Forms. Il nome della maschera è Form1. In Visual C# 2005 e nelle versioni successive, i due file che rappresentano le maschere sono denominati Form1.cs e Form1.designer.cs. Il codice viene scritto nel file Form1.cs. Progettazione Windows Forms scrive il codice nel file Form1.designer.cs.

    Per convertire il codice di esempio in Visual C# 2005 o Visual C# 2008, creare una nuova applicazione Visual C# Windows, quindi attenersi alla seguente procedura:
    1. Copiare l'oggetto Button, l'oggetto Text box e gli altri oggetti Windows nella classe parziale Form1 del file Form1.Designer.cs.
    2. Aggiungere il contenuto della sezione del metodo InitializeComponent del codice precedente al metodo InitializeComponent del file Form1.Designer.cs. Incollare il contenuto dopo il contenuto corrente del metodo InitializeComponent.
    3. Copiare i seguenti metodi del codice precedente nella classe Form1 del file Form1.cs:
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Aggiungere l'istruzione using System.IO; al file Form1.cs.
    Per ulteriori informazioni su Progettazione Windows Forms, visitare il seguente sito Web MSDN (Microsoft Developer Network):
    http://msdn2.microsoft.com/it-it/library/ms173077(VS.80).aspx
  6. Premere F5 per compilare ed eseguire il programma di esempio.

Riferimenti

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
306777 Come leggere un file di testo utilizzando System.IO e Visual C#
Nota: questo è un articolo a "PUBBLICAZIONE RAPIDA", creato direttamente all'interno dell'organizzazione di supporto Microsoft. Le informazioni contenute nel presente documento vengono fornite "così come sono" in risposta alle problematiche riscontrate. A causa della rapidità con cui vengono resi disponibili, i materiali possono contenere errori di battitura e sono soggetti a modifica senza preavviso, in qualsiasi momento. Per altre considerazioni, vedere le Condizioni per l'utilizzo.

Proprietà

Identificativo articolo: 303974 - Ultima modifica: venerdì 23 agosto 2013 - Revisione: 1.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
Chiavi: 
kbhowtomaster kbio KB303974
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