Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
Заблокирован

Как выполнить поиск файлов в папке и подпапках, и подподпапках, и т.д.?

09.10.2011, 00:48. Показов 4620. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Как выполнить поиск файлов в папке и подпапках, и подподпапках, и т.д.?

В поисковики не посылать: был, то что нашел, не заработало.

Буду очень благодарен за подробный код с комментами

Зараннее спасибо!


Добавлено через 18 минут
Ответьте кто-нибудь, плиз
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.10.2011, 00:48
Ответы с готовыми решениями:

Поиск файлов в папке и подпапках
Приветствую всех. Есть папка, в ней много подпапок, в каждой из которых находятся файлы. Мне необходимо найти во всех этих подпапках и...

Поиск файлов форматов pdf, jpg, png в папке и подпапках
Доброго дня господа! Подскажите мне пожалуйста, как мне можно найти файлы форматов в папке и под папках не зная точного имени файла. ...

Поиск в папке и подпапках файлов, созданных или измененных за определенную дату
Есть папка(D:\wscom). В ней лежат файлы, папки, подпапки. на форме текстовое поле(для ввода даты за которую необходимо осуществить...

18
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
09.10.2011, 03:53
Все спят.
Рекурсивный поиск надо делать )

Добавлено через 27 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void search(System::IO::DirectoryInfo ^dirInfo, System::String ^what);
 
void search(System::IO::DirectoryInfo ^dirInfo, System::String ^what) {
    //  Получаем массив информации о файлах, удовлетворяющих шаблону
    cli::array<System::IO::FileInfo ^> ^filesInfo = dirInfo->GetFiles(what);
 
    //  Печатаем все найденные имена
    for each(System::IO::FileInfo ^f in filesInfo) {
        Console::WriteLine(f->FullName);
    }
 
    //  Получаем список поддиректорий, чьи имена содержат искомый шаблон
    cli::array<System::IO::DirectoryInfo ^> ^dirsMatchedInfo = dirInfo->GetDirectories(what);
    //  Выводим
    for each(System::IO::DirectoryInfo ^d in dirsMatchedInfo) {
        Console::WriteLine(d->FullName);
    }
 
    //  Получаем список всех поддиректорий
    cli::array<System::IO::DirectoryInfo ^> ^dirsInfo = dirInfo->GetDirectories();
    //  Во всех поддиректориях
    for each(System::IO::DirectoryInfo ^d in dirsInfo) {
        //  Собственно рекурсия
        search(d, what);
    }
}
 
int main(array<System::String ^> ^args)
{
    System::String ^searchPath = L"C:\\";
    System::String ^searchWhat = L"shared*";
    System::IO::DirectoryInfo ^dirInfo = System::IO::Directory::CreateDirectory(searchPath);
 
    search(dirInfo, searchWhat);
    return 0;
}
К примеру так. Можно вообще элементарно:
C++
1
2
3
4
    cli::array<System::IO::FileInfo ^> ^filesInfo = dirInfo->GetFiles(what, System::IO::SearchOption::AllDirectories);
    for each(System::IO::FileInfo ^f in filesInfo) {
        Console::WriteLine(f->FullName);
    }
Но этот вариант будет выводить результаты лишь после того, как слазит во все поддиректории. В случае корня диска искать будет долго, я лично на своем ноуте результата сейчас так и не дождался за пару минут.
А первый вариант пообъемнее, но будет выводить сразу.
2
Заблокирован
17.10.2011, 23:46  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Все спят.
Рекурсивный поиск надо делать )


Но этот вариант будет выводить результаты лишь после того, как слазит во все поддиректории. В случае корня диска искать будет долго, я лично на своем ноуте результата сейчас так и не дождался за пару минут.
А первый вариант пообъемнее, но будет выводить сразу.
Спасибо большое, вроде получилось
0
Заблокирован
30.10.2011, 18:57  [ТС]
Когда пробую выполнить поиск файлов указанным выше методом, то программа запускается, и функция, вроде, вызывается, но поиска файлов не происходит В чем я на косячил?

объявляю функцию

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Playlist::typeid));
            this->LV1 = (gcnew System::Windows::Forms::ListView());
            this->CH1 = (gcnew System::Windows::Forms::ColumnHeader());
            this->CH2 = (gcnew System::Windows::Forms::ColumnHeader());
            this->CH3 = (gcnew System::Windows::Forms::ColumnHeader());
            this->CH4 = (gcnew System::Windows::Forms::ColumnHeader());
            this->CH5 = (gcnew System::Windows::Forms::ColumnHeader());
            this->CH6 = (gcnew System::Windows::Forms::ColumnHeader());
            this->pAddF = (gcnew System::Windows::Forms::PictureBox());
            this->pAddFSel = (gcnew System::Windows::Forms::PictureBox());
            this->FBD1 = (gcnew System::Windows::Forms::FolderBrowserDialog());
            this->pFAdd = (gcnew System::Windows::Forms::PictureBox());
            this->pFAddSel = (gcnew System::Windows::Forms::PictureBox());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pAddF))->BeginInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pAddFSel))->BeginInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pFAdd))->BeginInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pFAddSel))->BeginInit();
            this->SuspendLayout();
            // 
            // LV1
            // 
            this->LV1->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(64)), static_cast<System::Int32>(static_cast<System::Byte>(64)), 
                static_cast<System::Int32>(static_cast<System::Byte>(64)));
            this->LV1->BorderStyle = System::Windows::Forms::BorderStyle::None;
            this->LV1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::ColumnHeader^  >(6) {this->CH1, this->CH2, this->CH3, 
                this->CH4, this->CH5, this->CH6});
            this->LV1->ForeColor = System::Drawing::Color::WhiteSmoke;
            this->LV1->Location = System::Drawing::Point(0, 0);
            this->LV1->Name = L"LV1";
            this->LV1->Size = System::Drawing::Size(382, 501);
            this->LV1->TabIndex = 0;
            this->LV1->UseCompatibleStateImageBehavior = false;
            this->LV1->View = System::Windows::Forms::View::Details;
            this->LV1->DrawItem += gcnew System::Windows::Forms::DrawListViewItemEventHandler(this, &Playlist::LV1_DrawItem);
            this->LV1->DrawSubItem += gcnew System::Windows::Forms::DrawListViewSubItemEventHandler(this, &Playlist::LV1_DrawSubItem);
            this->LV1->ItemCheck += gcnew System::Windows::Forms::ItemCheckEventHandler(this, &Playlist::LV1_ItemCheck);
            // 
            // CH1
            // 
            this->CH1->Text = L"";
            this->CH1->Width = 26;
            // 
            // CH2
            // 
            this->CH2->Text = L"Название трека";
            this->CH2->Width = 146;
            // 
            // CH3
            // 
            this->CH3->Text = L"Исполнитель";
            this->CH3->Width = 83;
            // 
            // CH4
            // 
            this->CH4->Text = L"Время";
            this->CH4->Width = 53;
            // 
            // CH5
            // 
            this->CH5->Text = L"Альбом";
            this->CH5->Width = 74;
            // 
            // CH6
            // 
            this->CH6->Text = L"Адрес";
            this->CH6->Width = 600;
            // 
            // pAddF
            // 
            this->pAddF->BackColor = System::Drawing::Color::Transparent;
            this->pAddF->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pAddF.Image")));
            this->pAddF->InitialImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pAddF.InitialImage")));
            this->pAddF->Location = System::Drawing::Point(10, 504);
            this->pAddF->Name = L"pAddF";
            this->pAddF->Size = System::Drawing::Size(48, 48);
            this->pAddF->TabIndex = 1;
            this->pAddF->TabStop = false;
            this->pAddF->MouseEnter += gcnew System::EventHandler(this, &Playlist::pAddF_MouseEnter);
            // 
            // pAddFSel
            // 
            this->pAddFSel->BackColor = System::Drawing::Color::Transparent;
            this->pAddFSel->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pAddFSel.Image")));
            this->pAddFSel->InitialImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pAddFSel.InitialImage")));
            this->pAddFSel->Location = System::Drawing::Point(10, 504);
            this->pAddFSel->Name = L"pAddFSel";
            this->pAddFSel->Size = System::Drawing::Size(48, 48);
            this->pAddFSel->TabIndex = 2;
            this->pAddFSel->TabStop = false;
            this->pAddFSel->Visible = false;
            this->pAddFSel->Click += gcnew System::EventHandler(this, &Playlist::pAddFSel_Click);
            this->pAddFSel->MouseLeave += gcnew System::EventHandler(this, &Playlist::pAddFSel_MouseLeave);
            // 
            // FBD1
            // 
            this->FBD1->Description = L"Укажите папку с музыкой:";
            this->FBD1->ShowNewFolderButton = false;
            // 
            // pFAdd
            // 
            this->pFAdd->BackColor = System::Drawing::Color::Transparent;
            this->pFAdd->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pFAdd.Image")));
            this->pFAdd->InitialImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pFAdd.InitialImage")));
            this->pFAdd->Location = System::Drawing::Point(64, 504);
            this->pFAdd->Name = L"pFAdd";
            this->pFAdd->Size = System::Drawing::Size(48, 48);
            this->pFAdd->TabIndex = 3;
            this->pFAdd->TabStop = false;
            this->pFAdd->MouseEnter += gcnew System::EventHandler(this, &Playlist::pFAdd_MouseEnter);
            //
            // search
            //
            void search(System::IO::DirectoryInfo ^dirInfo, System::String ^what);
            // 
            // pFAddSel
            // 
            this->pFAddSel->BackColor = System::Drawing::Color::Transparent;
            this->pFAddSel->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pFAddSel.Image")));
            this->pFAddSel->InitialImage = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"pFAddSel.InitialImage")));
            this->pFAddSel->Location = System::Drawing::Point(64, 504);
            this->pFAddSel->Name = L"pFAddSel";
            this->pFAddSel->Size = System::Drawing::Size(48, 48);
            this->pFAddSel->TabIndex = 4;
            this->pFAddSel->TabStop = false;
            this->pFAddSel->Visible = false;
            this->pFAddSel->Click += gcnew System::EventHandler(this, &Playlist::pFAddSel_Click);
            this->pFAddSel->MouseLeave += gcnew System::EventHandler(this, &Playlist::pFAddSel_MouseLeave);
            // 
            // Playlist
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->BackColor = System::Drawing::Color::Black;
            this->ClientSize = System::Drawing::Size(384, 562);
            this->Controls->Add(this->pFAddSel);
            this->Controls->Add(this->pFAdd);
            this->Controls->Add(this->pAddFSel);
            this->Controls->Add(this->pAddF);
            this->Controls->Add(this->LV1);
            this->Name = L"Playlist";
            this->Text = L"Плейлист";
            this->Load += gcnew System::EventHandler(this, &Playlist::Playlist_Load);
            this->ControlAdded += gcnew System::Windows::Forms::ControlEventHandler(this, &Playlist::Playlist_ControlAdded);
            this->Resize += gcnew System::EventHandler(this, &Playlist::Playlist_Resize);
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pAddF))->EndInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pAddFSel))->EndInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pFAdd))->EndInit();
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pFAddSel))->EndInit();
            this->ResumeLayout(false);
 
        }
вырезку из кода привел, чтобы было видно, где объявляю.

вызываю

C++
1
2
3
4
5
6
7
8
9
10
private: System::Void pFAddSel_Click(System::Object^  sender, System::EventArgs^  e) {
              System::Windows::Forms::DialogResult result = FBD1->ShowDialog();
              if ( result == System::Windows::Forms::DialogResult::OK ) {
                  System::String ^searchPath = FBD1 -> SelectedPath;
                  System::String ^searchWhat = L"\*";
                  System::IO::DirectoryInfo ^dirInfo = System::IO::Directory::CreateDirectory(searchPath);
 
                  search(dirInfo, searchWhat);
              }
         }
сама функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
         // search of files
 
void search(System::IO::DirectoryInfo ^dirInfo, System::String ^what) {
        //      Получаем массив информации о файлах, удовлетворяющих шаблону
        cli::array<System::IO::FileInfo ^> ^filesInfo = dirInfo->GetFiles(what);
 
        //      Печатаем все найденные имена
        for each(System::IO::FileInfo ^f in filesInfo) {
                Console::WriteLine(f->FullName);
        }
 
        //      Получаем список поддиректорий, чьи имена содержат искомый шаблон
        cli::array<System::IO::DirectoryInfo ^> ^dirsMatchedInfo = dirInfo->GetDirectories(what);
        //      Выводим
        for each(System::IO::DirectoryInfo ^d in dirsMatchedInfo) {
            [B]Playlist::LV1->Items->Add(d->FullName);;[/B] //заношу результат в listview
        }
 
        //      Получаем список всех поддиректорий
        cli::array<System::IO::DirectoryInfo ^> ^dirsInfo = dirInfo->GetDirectories();
        //      Во всех поддиректориях
        for each(System::IO::DirectoryInfo ^d in dirsInfo) {
                //      Собственно рекурсия
                search(d, what);
}
}

Добавлено через 3 часа 16 минут
Ответьте, пожалуйста, кто-нибудь
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
30.10.2011, 20:02
Небось строку с запросом неверно записываешь, там звездочка нужна на конце.
1
Заблокирован
30.10.2011, 21:01  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Небось строку с запросом неверно записываешь, там звездочка нужна на конце.
Так есть же звездочка?! *.* тоже не работает
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
30.10.2011, 22:04
Дай мне *.cpp-шник от консольного C++/CLI приложения, чтобы я сам не собирал эти куски воедино, я посмотрю и попробую найти ошибку.
1
Заблокирован
31.10.2011, 23:36  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Дай мне *.cpp-шник от консольного C++/CLI приложения, чтобы я сам не собирал эти куски воедино, я посмотрю и попробую найти ошибку.
В консоле у меня получается это сделать, но мне нужно с формой когда разобраться

Можешь выложить рабочий пример, чтоб была форма с кнопкой поиск и listview куда заносятся результаты поиска?
Заранее спасибо!
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
31.10.2011, 23:47
Мне этим заниматься времени сейчас нет, ты бы хоть макет формы накидал, упростил работу мне.
1
Заблокирован
02.11.2011, 19:48  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Мне этим заниматься времени сейчас нет, ты бы хоть макет формы накидал, упростил работу мне.
У меня 2010 У тебя запустится?
0
Заблокирован
02.11.2011, 20:00  [ТС]
Вот, готово!
Вложения
Тип файла: zip FormForSearch.zip (760.4 Кб, 31 просмотров)
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
03.11.2011, 23:44
Cейчас наваяем.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.11.2011, 00:27
Забирай
Миниатюры
Как выполнить поиск файлов в папке и подпапках, и подподпапках, и т.д.?  
Вложения
Тип файла: rar Search.rar (8.2 Кб, 64 просмотров)
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.11.2011, 14:06
А вот вариант с деревом:
Вложения
Тип файла: rar Search.rar (8.3 Кб, 49 просмотров)
1
Заблокирован
04.11.2011, 18:35  [ТС]
Большое спасибо, теперь все понятно и наглядно
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.11.2011, 22:14
Чтобы все это заполнялось побыстрее - нужно поиск вынести в отдельный поток, тогда список/дерево будут заполняться по мере нахождения новых айтемов.
В случае с деревом вообще стоит заполнять лишь текущий уровень вложенности, если пользователь нажал на одну из папок и захотел увидеть её содержимое - заполнять её, и так далее. Так можно и корень диска без проблем вывести в дереве, а с текущим вариантом придется ждать долго, пока алгоритм не залезет во все папки на всем диске :-)
1
0 / 0 / 0
Регистрация: 04.12.2011
Сообщений: 4
27.07.2013, 01:47
Цитата Сообщение от Герц Посмотреть сообщение
А вот вариант с деревом:
Мне тоже надо, но не могу открыть вложение. Пишет просмотр только со страниц сайта и возвращает обратно.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.07.2013, 22:12
Цитата Сообщение от GhostMan Посмотреть сообщение
Как выполнить поиск файлов в папке и подпапках, и подподпапках, и т.д.?
Рецепты приведены выше.
Добавлю, что поиск файлов должен также учитывать наличие на дисках
таких вещей, как reparse points. Например, папка "Goto_D" на диске "C" может
быть точкой монтирования диска "D". А папка "Goto_C" на диске "D" может
указывать обратно, на диск "C". При попытке выполнить рекурсивный обход
папок в такой файловой структуре произойдет зацикливание.
0
1 / 1 / 1
Регистрация: 25.02.2013
Сообщений: 38
12.08.2013, 00:41
А яем вас не устраивает православный
C++
1
%массив String^% = IO::Directory::GetFiles(%путь%, "*.*", IO::SearchOption::AllDirectories);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2013, 00:41
Помогаю со студенческими работами здесь

Как получить список файлов в папке и подпапках
1.Как получить список файлов в выбранной папке и в её подпапках вот в таком вот виде? \Folder\Файл.txt ...

Список файлов в папке и её подпапках
Привет всем скажите пожалуйста как получить список файлов в папке и её подпапках и подпапках папок этих подпапок :D вот такая вот муть)) ...

Получить список файлов в папке и подпапках
Каким образом получить список файлов в текущей папке приложения и всех подпапках рядом, с учетом доступа? Например: string files =...

Создание списка файлов в папке и подпапках
Здравствуйте. Есть папка с подпапками, названия могут быть разные. Нужно получить список всех файлов и путь к ним. Чтобы в...

Посчитать количество файлов в папке и подпапках
Приветствую всех! Появилась задача посчитать кол-во файлов в папке и подпапках. И все бы ничего, если бы не надо было это сделать по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru