Рекурсивный поиск каталогов с помощью C#

ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.

Эта статья на английском языке: 303974
Версию данной статьи Microsoft Visual C++ .NET см. 307009.
Для версии Microsoft Visual Basic .NET в данной статье см. 306666.

В данной статье относится к следующим пространства имен библиотеки классов Microsoft платформа.NET Framework:
  • System.IO
Аннотация
В данном пошаговом руководстве показано, как подкаталоги рекурсивный поиск файлов в приложении Windows Forms C#. Строку поиска задано таким образом, можно выполнить поиск файлов, соответствующих определенным критериям подстановочных знаков. Каждая часть кода приведено в случае необходимости. Примеры кода также приведены в конце статьи.

Каталог рекурсии является распространенные задачи ввода-ВЫВОДА для разработчиков. FileSystemObject упрощает эту задачу для модели компонентных объектов (COM) приложений. Теперь эта задача стала еще проще в .NET. Подобно FileSystemObject, объектно ориентированным способом доступа к файлам и каталогам предоставляют классы в пространстве имен System.IO .

Требования

  • Microsoft Visual C# 2005 или Microsoft Visual C# .NET

Рекурсия каталогов

Классы обработки файлов и каталогов находятся в пространстве имен System.IO . Перед началом работы с этими классами, нужно импортировать следующие пространства имен в проект:
using System.IO;
Классы пространства имен System.IO предоставляет множество классов, которые позволяют работать с файлами и каталогами. Эти классы содержат файл классы, классы каталогов и служебные классы. Многие из этих классов содержит статические методы, которые можно вызвать без необходимости объявляется переменная этого типа. Например можно использовать объект каталога для получения вложенных каталогах заданного каталога.

Следующий код использует статический метод GetDirectories объекта каталога для возвращения массива строк. Этот массив содержит каталог имена путей подкаталогов каталога C, если таковые имеются.
string[] directories = Directory.GetDirectories("C:\\");
Объект каталога также содержит метод с именем GetFiles позволяет извлекать строковый массив файлов, которые соответствуют определенным критериям. В следующем примере кода используется объект файла для извлечения всех файлов в каталоге с расширением DLL:
string[] files = Directory.GetFiles("C:\\", "*.dll");
Методы GetFiles и GetDirectories объекта Directory — все, что вам необходимо для рекурсивного поиска файлов, соответствующих строке поиска. Следующий метод используется для реализации рекурсии.
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);	}}
Приведенный выше код передает строку, которая содержит каталог, который требуется найти в DirSearch. Это строковое значение определяет полный путь к каталогу. GetDirectories можно использовать для извлечения подкаталоги каталога, передаваемый в процедуру. Так как GetDirectories возвращает массив, можно использовать для/каждой инструкции для перебора каждого подкаталога. Для каждой подпапки используйте метод GetFiles для просмотра всех файлов в этом каталоге. Значение текстового поля на форме передается GetFiles. В текстовом поле содержится строка поиска, который фильтрует результаты, которые возвращаются GetFiles . Если любые файлы, соответствующие условиям поиска, они добавляются в список. Для каждой подпапки, которая находится снова вызовите DirSearch и передайте его подкаталог. С помощью этого рекурсивный вызов, можно выполнить поиск всех подкаталогах указанного корневого каталога.

Полный пример кода

  1. Начните новый проект приложение Windows Visual C#. По умолчанию форма с именем Form1 iscreated.
  2. В меню Вид щелкните окно обозревателя решений.
  3. В обозревателе решений щелкните правой кнопкой мыши форму Form1и выберите команду Просмотреть код.
  4. В окно кода Form1 выделите и удалите существующий код allthe.
  5. Вставьте следующий код в окно кода 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);            }        }    }}
    Примечание. Необходимо изменить код в Visual Studio 2005 и Visual Studio 2008. В версиях Visual Studio, более ранних, чем Visual Studio 2005 C# добавляет одну форму в проект при создании проекта Windows Forms. Форма с именем Form1. В Visual C# 2005 и более поздних версиях двух файлов, представляющих собой форму именами Form1.cs и Form1.designer.cs. Необходимо написать код в файле Form1.cs. Конструктор Windows Forms записывает код в файл Form1.designer.cs.

    Чтобы преобразовать образец кода в Visual C# 2005 или Visual C# 2008, создайте новое приложение Windows Visual C# и затем выполните следующие действия:
    1. Разделяемый класс Form1 в файле Form1.Designer.cs Копировать объект кнопки , объект текстового поля и других объектов Windows.
    2. Добавьте содержимое раздела метода InitializeComponent в приведенный выше метод InitializeComponent в файле Form1.Designer.cs. Вставка содержимого после текущего содержимого метода InitializeComponent .
    3. Скопируйте следующие методы из кода выше в класс Form1 в файле Form1.cs.
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. Добавьте using System.IO; с помощью инструкции в файле Form1.cs.
    Дополнительные сведения о конструкторе Windows Forms посетите следующий веб-узел Microsoft Developer Network (MSDN):
  6. Нажмите клавишу F5, чтобы построить и запустить sampleprogram.
Ссылки
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
306777 Чтение текстового файла с использованием System.IO и C#

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 303974 — последний просмотр: 07/03/2016 19:14:00 — редакция: 8.0

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2008 Express Edition

  • kbhowtomaster kbio kbmt KB303974 KbMtru
Отзывы и предложения