كيفية مجلدات البحث بشكل متكرر باستخدام Visual c + +

للحصول على إصدار Microsoft Visual Basic.NET من هذه المقالة، راجع
306666 .
للحصول على إصدار Microsoft C#.NET من هذه المقالة، راجع
303974 .

تشير هذه المقالة إلى مكتبة فئات Microsoft.NET Framework مساحات الأسماء التالية:
  • System.IO
  • System.ComponentModel
  • System.Windows.Forms
  • System.Drawing

في هذه المهمة

ملخص

توضح هذه المقالة خطوة بخطوة كيفية إلى المجلدات الفرعية البحث بشكل متكرر للملفات، بدءاً من مجلد جذر باستخدام التعليمات البرمجية. يعرف الدليل الإعادة هذه المهمة. يمكنك تحديد سلسلة بحث حيث يمكنك البحث عن الملفات التي تطابق معايير معينة. يتم توضيح كل جزء من التعليمات البرمجية في هذه المقالة، ويتم أيضا توفير نموذج التعليمات برمجية عمل.

دليل العودية مهمة الإدخال/إخراج شائعة للمطورين. الكائن FileSystemObject تسهيل هذه المهمة لبرامج طراز كائن المكون (COM)، ولكن هذه المهمة أسهل في Visual c + +.NET 2002. مشابه للكائن FileSystemObject ، توفر الفئات في مساحة الاسم System.IO طريقة ذات المنحى للوصول إلى الملفات والمجلدات.

عودة إلى الأعلى

متطلبات

توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة وحزم الخدمات التي تحتاجها:
  • Microsoft Visual c + +.NET أو Microsoft Visual c + + 2005
عودة إلى الأعلى

تمكين الإعادة في الدليل

فئات معالجة الدلائل والملفات الموجودة في مساحة الاسم system:: io . قبل بدء العمل بهذه الفئات، أضف التعليمات البرمجية التالية:
using <mscorlib.dll>using namespace System;
using namespace System::IO;
مساحة الاسم system:: io يوفر العديد من الخيارات للعمل مع الملفات والمجلدات. توفر مساحة الاسم system:: io ليس فقط الفئات التي يمكنك إنشاء مثيل، لكنه يوفر أيضا فئات المساعدة الدلائل والملفات. تتضمن هذه الفئات أساليب ثابتة يمكنك الاتصال دون الحاجة إلى تعريف متغير من هذا النوع. على سبيل المثال، يمكنك استخدام فئة الدليل للحصول على المجلدات الفرعية للمجلد.

تستخدم التعليمة البرمجية التالية أسلوب GetDirectories ثابتة من فئة الدليل ﻹرجاع صفيف سلاسل. هذا الصفيف يحتوي على مسارات المجلدات إلى المجلدات الفرعية للمجلد C:\، إذا كان هناك أي منها:
String* directories[] = Directory::GetDirectories("C:\\");
تحتوي فئة الدليل أيضا على أسلوب GetFiles . يمكنك استخدام GetFiles استرداد صفيف سلسلة من الملفات التي تطابق معايير معينة. يستخدم نموذج التعليمات البرمجية التالي أسلوب GetFiles لاسترداد كافة الملفات في المجلد C:\ مع ملحق اسم ملف.dll:
String* files[] = Directory::GetFiles("C:\\", "*.dll");
يمكنك استخدام الأسلوب GetDirectories وأسلوب GetFiles فئة الدليل للبحث بشكل متكرر عن الملفات التي تطابق سلسلة البحث. استخدم الأسلوب التالي لتنفيذ الإعادة:
 void DirSearch(String* sDir) {
try
{
// Find the subfolders in the folder that is passed in.
String* d[] = Directory::GetDirectories(sDir);
int numDirs = d->get_Length();

for (int i=0; i < numDirs; i++)
{
// Find all the files in the subfolder.
String* f[] = Directory::GetFiles(d[i],textBox1->Text);
int numFiles = f->get_Length();

for (int j=0; j < numFiles; j++)
{
listBox1->Items->Add(f[j]);
}
DirSearch(d[i]);
}
}
catch (System::Exception* e)
{
MessageBox::Show(e->Message);
}
}
مسارات التعليمات البرمجية السابقة سلسلة للدالة DirSearch . قيمة سلسلة هذا هو المسار الكامل للمجلد الذي تريد البحث. يمكنك استخدام الأسلوبGetDirectories لاسترداد المجلدات الفرعية للمجلد التي يتم تمريرها إلى الإجراء الخاص بك. لأن الأسلوب GetDirectories إرجاع صفيف، يمكنك استخدام عبارة التكرار في كل مجلد فرعي. لكل مجلد فرعي، استخدم أسلوب GetFiles للمرور عبر الملفات الموجودة في هذا المجلد. يتم تمرير قيمة مربع النص على النموذج الخاص بك إلى أسلوب GetFiles . يحتوي مربع النص على سلسلة البحث الذي يقوم بتصفية النتائج التي إرجاع الأسلوب GetFiles . عندما الملف يطابق معايير البحث، يتم إضافته إلى مربع القائمة. لكل مجلد فرعي موجود، استدعاء الدالة DirSearch مرة أخرى، ومن ثم تمرير مجلد فرعي. يمكنك استخدام هذه الإعادة للبحث في كافة المجلدات الفرعية للمجلد الجذر الذي قمت بتحديده.

عودة إلى الأعلى

إنشاء نموذج

  1. بدء تشغيل Microsoft Visual Studio.NET 2003 أو Microsoft Visual Studio 2005.
  2. في القائمة ملف ، أشر إلى
    جديد، ثم انقر فوق المشروع.
  3. ضمن أنواع المشروع، انقر فوق
    Visual c + +.NET.

    ملاحظة: في Microsoft Visual c + + 2005، يتم تغيير Visual c + +.NET في Visual c + +.
  4. ضمن قوالب، انقر فوق
    تطبيق نماذج Windows (.NET).
  5. في المربع الاسم ، اكتب
    ريكورسيفيسيرتشكب. في المربع تحديد موقع، اكتب C:\، ومن ثم انقر فوق
    OK.
  6. افتح النموذج Form1 في طريقة عرض التصميم ومن ثم اضغط F4 لفتح الإطار خصائص.
  7. في نافذة الخصائص، قم بتوسيع المجلد الحجم . في حقل العرض ، اكتب
    700-في ارتفاع الحقل، اكتب
    320.
  8. إضافة عنصري تحكم تسمية وعنصر تحكم مربع نص واحد
    عنصر تحكم مربع تحرير وسرد وعنصر تحكم مربع قائمة وعنصر تحكم زر إلى النموذج Form1.
  9. في الإطار "خصائص"، تغيير
    موقعو حجم TabIndexوخصائص النص كما يلي:
    معرف عنصر التحكمموقعالحجمفهرسالنص
    label18، 16144، 165البحث عن الملفات التي تحتوي على:
    textBox18 و 40120، 204*.dll
    label28, 96120، 253البحث في:
    button1608، 24875، 250& البحث
    listBox1152, 8530، 2251
    comboBox18 و 128120، 252C:\\
  10. في أسلوب InitializeComponent لمربع التحرير والسرد، أضف التعليمة البرمجية التالية لإدراج كافة محركات شبكة الاتصال المتوفرة على الكمبيوتر:
    // Enlist all the network drives that are available on the computer.String* p_logicalDrives[] = __gc new String*[];
    comboBox1->Items->Clear();
    p_logicalDrives = Directory::GetLogicalDrives();
    int numDrives = p_logicalDrives->get_Length();

    for (int i=0; i< numDrives; i++)
    {
    comboBox1->Items->Add(p_logicalDrives[i]);
    }
  11. انقر نقراً مزدوجاً فوق زر البحث ثم قم بلصق التعليمة البرمجية التالية في الأسلوب:
    // Clear the list box.listBox1->Items->Clear();
    // You do not have the option to change the values of the files to be searched
    // until the search is completed. Therefore, the following value is false.
    textBox1->Enabled = false;
    comboBox1->Enabled = false;

    button1->Text = S"Searching...";
    this->Cursor = Cursors::WaitCursor;
    Application::DoEvents();

    // Callthe recursive search method.
    DirSearch(comboBox1->Text);
    button1->Text = S"Search";
    this->Cursor = Cursors::Default;

    // After the search is completed, the search criteria is enabled
    //and you can add other search criteria to search the files recursively.
    textBox1->Enabled = true;
    comboBox1->Enabled = true;

  12. لبناء التطبيق، اضغط CTRL + F5 للبناء.
  13. قم بتشغيل التطبيق.
عودة إلى الأعلى

إكمال نموذج التعليمات البرمجية

// Form1.h#pragma once

namespace RecursiveSearchCPP
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::IO;

/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you must change the
/// Resource File Name property for the managed resource compiler tool
/// that is associated with all .resx files that this class depends on. Otherwise,
/// the designers will not be able to interact correctly with localized
/// resources that are associated with this form.
/// </summary>
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
}

protected:
void Dispose(Boolean disposing)
{
// Form::Dispose(Disposing);
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::Label * label1;
private: System::Windows::Forms::TextBox * textBox1;
private: System::Windows::Forms::Label * label2;
private: System::Windows::Forms::Button * button1;
private: System::Windows::Forms::ListBox * listBox1;
private: System::Windows::Forms::ComboBox * comboBox1;

private:
/// <summary>
/// This is the required designer variable.
/// </summary>
System::ComponentModel::Container * components;

/// <summary>
/// This is the required method for Designer support. Do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->label1 = new System::Windows::Forms::Label();
this->textBox1 = new System::Windows::Forms::TextBox();
this->label2 = new System::Windows::Forms::Label();
this->button1 = new System::Windows::Forms::Button();
this->listBox1 = new System::Windows::Forms::ListBox();
this->comboBox1 = new System::Windows::Forms::ComboBox();
this->SuspendLayout();
//
// label1
//
this->label1->Location = System::Drawing::Point(8, 16);
this->label1->Name = S"label1";
this->label1->Size = System::Drawing::Size(144, 16);
this->label1->TabIndex = 5;
this->label1->Text = S"Search for files containing:";
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(8, 40);
this->textBox1->Name = S"textBox1";
this->textBox1->Size = System::Drawing::Size(120, 20);
this->textBox1->TabIndex = 4;
this->textBox1->Text = S"*.dll";
//
// label2
//
this->label2->Location = System::Drawing::Point(8, 96);
this->label2->Name = S"label2";
this->label2->Size = System::Drawing::Size(120, 23);
this->label2->TabIndex = 3;
this->label2->Text = S"Look in:";
//
// button1
//
this->button1->Location = System::Drawing::Point(608, 248);
this->button1->Name = S"button1";
this->button1->TabIndex = 0;
this->button1->Text = S"&Search";
this->button1->Click += new System::EventHandler(this, button1_Click);
//
// listBox1
//
this->listBox1->Location = System::Drawing::Point(152, 8);
this->listBox1->Name = S"listBox1";
this->listBox1->Size = System::Drawing::Size(530, 225);
this->listBox1->TabIndex = 1;
//
// comboBox1
//
// Enlist all the network drives that are available on the computer.
//
String* p_logicalDrives[] = __gc new String*[];
comboBox1->Items->Clear();
p_logicalDrives = Directory::GetLogicalDrives();
int numDrives = p_logicalDrives->get_Length();
for (int i=0; i< numDrives; i++)
{
comboBox1->Items->Add(p_logicalDrives[i]);
}
this->comboBox1->Location = System::Drawing::Point(8, 128);
this->comboBox1->Name = S"comboBox1";
this->comboBox1->Size = System::Drawing::Size(120, 25);
this->comboBox1->TabIndex = 2;
this->comboBox1->Text = S"C:\\";

//
// Form1
//
this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
this->ClientSize = System::Drawing::Size(688, 286);
this->Controls->Add(this->comboBox1);
this->Controls->Add(this->listBox1);
this->Controls->Add(this->button1);
this->Controls->Add(this->label2);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->label1);
this->Name = S"Form1";
this->Text = S"Form1";
this->ResumeLayout(false);

}

private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
//Clears the list box
listBox1->Items->Clear();
// You do not have option to change the values of the files to be searched
// until the search is completed. Therefore, the value of the following is false.
textBox1->Enabled = false;
comboBox1->Enabled = false;

button1->Text = S"Searching...";
this->Cursor = Cursors::WaitCursor;
Application::DoEvents();

// Call the recursive search method.
DirSearch(comboBox1->Text);
button1->Text = S"Search";
this->Cursor = Cursors::Default;

// After the search is completed, the search criteria is enabled
// and you can add other search criteria to search the files recursively.
textBox1->Enabled = true;
comboBox1->Enabled = true;
}

void DirSearch(String* sDir)
{
try
{
// Find the subfolders in the folder that is passed in.
String* d[] = Directory::GetDirectories(sDir);
int numDirs = d->get_Length();

for (int i=0; i < numDirs; i++)
{
// Find all the files in the subfolder.
String* f[] = Directory::GetFiles(d[i],textBox1->Text);
int numFiles = f->get_Length();

for (int j=0; j < numFiles; j++)
{
listBox1->Items->Add(f[j]);
}
DirSearch(d[i]);
}
}
catch (System::Exception* e)
{
System::Console::WriteLine(e->Message);
}
}
};
}

//Form1.cpp
#include "stdafx.h"
#include "Form1.h"
#include <windows.h>

using namespace RecursiveSearchCPP;

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
Application::Run(new Form1());
return 0;
}
عودة إلى الأعلى

المراجع

لمزيد من المعلومات حول كيفية إنشاء نماذج Windows في الملحقات المدارة ل Visual c + +.NET 2002، راجع نموذج "ماناجيدكوينفورمويز" في تعليمات Visual Studio.NET.

عودة إلى الأعلى
خصائص

رقم الموضوع: 307009 - آخر مراجعة: 18‏/01‏/2017 - المراجعة: 1

تعليقات