Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034

Поиск папок, файлов

14.09.2013, 17:05. Показов 7240. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть код который перечислит название всех папок с корня диска С в Мемо-моле:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var
   searchResult : TSearchRec;
begin
   // Èùåì êàòàëîãè íà äèñêå Ñ
   SetCurrentDir('C:\');
 
   if FindFirst('*', faDirectory, searchResult) = 0 then
   begin
     repeat
      // Ïîêàçûâàåì òîëüêî êàòàëîãè
       if (searchResult.attr and faDirectory) = faDirectory
       then Memo1.Lines.Add('Directory = '+searchResult.Name);
     until FindNext(searchResult) <> 0;
 
    // Îâîáîäèì ðåñóðñû, èñïîëüçóåìûå ýòèìè óñïåøíûìè, ïîèñêàìè
     FindClose(searchResult);
   end;
 end;
Но тока с корня диска он может а мне этого мало!
Мне нужно чтобы код защел еще и в каждую папку (второго уровня) на диске С и там перечислил названия всех папок в мемо-поле,
Я немогу этого добиться этим кодом и сделал такой на основе компонентов с вкладки Win 3.1:

Delphi
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
procedure TForm1.Button8Click(Sender: TObject);
var
i: Integer;
begin
  DirectoryListBox1.ItemIndex := 0; //èäåì â íà÷àëî äèñêà
  DirectoryListBox1.OpenCurrent; //îòêðûâàåì åãî
 
  for i := 0 to DirectoryListBox1.Count-1  do
  begin
  DirectoryListBox1.ItemIndex:=i;
   //ShowMessage('Ìû ñåé÷àñ íà ïàïêå '+IntToStr(i));
 
   DirectoryListBox1.OpenCurrent; //îòêðûòü
   //ShowMessage('Îòêðûëè ïàïêó '+IntToStr(i));
 
   Memo1.Lines.Add(DirectoryListBox1.Items.Text);
   //ShowMessage('Ñêîïèðîâàëè èìåíà ïàïîê èç îòêðûòîé ïàïêè ');
 
   DirectoryListBox1.ItemIndex := 0; //èäåì â íà÷àëî äèñêà
   //ShowMessage('Âåðíóëèñü â êîðåíü äèñêà Ñ');
 
   DirectoryListBox1.OpenCurrent; //îòêðûòü
   //ShowMessage('È îòêðûëè äèñê Ñ');
  end;
end;
Код работает на ура я его протестил на 2 компах, он зайдет в первую папку на диске С скопирует оттуда имена папок, вернется на диск С и зайдет во вторую папку и там скопирует и тд пока недойдет до конца.

Но и этого мне как бы мало, нужно еще и имена файлов копировать, с вкладкой Win 3.1 вошкаться? или как это сделать на основе функции FindFirst
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2013, 17:05
Ответы с готовыми решениями:

Поиск файлов на диске с исключением папок
Такой вопрос: как это реализовать ? Есть рабочий код который нашел на просторах интернета, ищет файлы по маске, можно добавить много...

Поиск файлов и папок по параметрам: расширение, дата создания, размер, имя и фрагмент текста
Помогите пожалуйста! Нужно создать программу для поиска файлов и папок по параметрам: расширение, дата создания, размер, имя и фрагмент...

Считывание 2 файлов на выбор из папок и замена кода внутри файлов
имеется различные папки с файлами, например в папке c названием &quot;A 1&quot; - 3 файла, а в папке &quot;А 2&quot; - 4 файла, до этого я...

14
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.09.2013, 17:28
Рекурсия наше всё!
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
14.09.2013, 17:56
GetFiles в помощь (если он у тебя есть, конечно)... Задача решается в 2 строки. Ну, или продолжай цепляться за D7, и плоди код тоннами...
0
74 / 71 / 37
Регистрация: 10.09.2011
Сообщений: 169
14.09.2013, 19:17
Цитата Сообщение от UI Посмотреть сообщение
GetFiles в помощь (если он у тебя есть, конечно)... Задача решается в 2 строки. Ну, или продолжай цепляться за D7, и плоди код тоннами...
Неверно, тонны кода здесь не нужны. Рекурсия - верное решение!

NIKOLAYY, как сказал выше, можно переделать процедуру в ту, у которой можно задать уровень вложенности следующим способом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure FindWithLevel(path, ext:string; str:TStrings; level:integer);
var SR:TSearchRec;
begin
  if FindFirst(path+ext, faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr = faDirectory) then
        if (SR.Name <> '.') and (SR.Name <> '..') then
        begin
          str.Add('Directory = ' + SR.Name);
          if level <> 1 then FindWithLevel(path, ext, str, level - 1);
        end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   FindWithLevel('C:\', '*', Memo1.Lines, 2);
end;
Так найдет все на первом и на втором уровне. Если нужен еще и третий - меняешь последний параметр на 3. Если поставишь там 0 - он найдет папки на всех уровнях.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33379 / 21503 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 12
14.09.2013, 19:34
Цитата Сообщение от Rashiran Посмотреть сообщение
Рекурсия - верное решение!
Верное оно для тебя только потому, что другие решения недоступны... Мне (равно как и всем пользователям Delphi XE+) другие решения доступны, по ссылке есть пример. И на фиг мне после этого писать рекурсию руками?
1
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
14.09.2013, 20:04  [ТС]
Там явный путь папки в которой произвести поиск нужно указать?

Добавлено через 10 минут
Rashiran Спс работает но в мемо- поле много повторений названий папок с Корня диска С вроде

Добавлено через 18 минут
UI Большой вес у меня у программ получается собранных в Delphi XE3, ток поэтому он мне и ненравится.
0
74 / 71 / 37
Регистрация: 10.09.2011
Сообщений: 169
14.09.2013, 20:21
NIKOLAYY, извините, я протупил.
FindWithLevel('C:\', '*.*', Memo1.Lines, 2);
Надо во втором параметре ставить '*.*', а не '*'.

Добавлено через 6 минут
Цитата Сообщение от UI Посмотреть сообщение
Верное оно для тебя только потому, что другие решения недоступны... Мне (равно как и всем пользователям Delphi XE+) другие решения доступны, по ссылке есть пример. И на фиг мне после этого писать рекурсию руками?
Это ваша жизненная позиция - "зачем изобретать велосипед заново" и я ее уважаю. Я тоже пользователь тех версий делфи, конкретно - Delphi XE2. Rad Studio использую уже как полтора года. Однако, не нужно требовать от других пользователей безусловно думать и действовать как вы привыкли, а надо помогать им в том, в чем им удобно, если это в ваших силах.
И действительно - чужие модули громоздки и по возможности надо отказываться от них. В Java размер файлов куда меньше и кто сказал, что Delphi так не может? Моя позиция всё же такова.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.09.2013, 20:41
Цитата Сообщение от Rashiran Посмотреть сообщение
NIKOLAYY, извините, я протупил.
+
Delphi
1
if (SR.Attr and faDirectory) <> 0 then
+
Delphi
1
if level <> 1 then FindWithLevel(path+SR.Name+'\', ext, str, level - 1);
1
74 / 71 / 37
Регистрация: 10.09.2011
Сообщений: 169
14.09.2013, 20:44
Цитата Сообщение от northener Посмотреть сообщение
+
Delphi
1
if (SR.Attr and faDirectory) <> 0 then
+
Delphi
1
if level <> 1 then FindWithLevel(path+SR.Name+'\', ext, str, level - 1);
Первая поправка - не так важна. Одно и то же - по сути.
А вот вторая - это да.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure FindWithLevel(path, ext:string; str:TStrings; level:integer);
var SR:TSearchRec;
begin
  if FindFirst(path+ext, faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr = faDirectory) then
        if (SR.Name <> '.') and (SR.Name <> '..') then
        begin
          str.Add('Directory = ' + SR.Name);
          if level <> 1 then FindWithLevel(path+SR.Name+'\', ext, str, level - 1);
        end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   FindWithLevel('C:\', '*.*', Memo1.Lines, 2);
end;
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.09.2013, 20:56
Цитата Сообщение от Rashiran Посмотреть сообщение
Первая поправка - не так важна. Одно и то же - по сути.
По сути в вашем варианте будут пропущены все каталоги с атрибутами a,h,s & r
0
74 / 71 / 37
Регистрация: 10.09.2011
Сообщений: 169
14.09.2013, 21:04
Цитата Сообщение от northener Посмотреть сообщение
По сути в вашем варианте будут пропущены все каталоги с атрибутами a,h,s & r
Я в курсе. В Проводнике они тоже обычно пропущены. Вот и я делаю как в Проводнике, что и просилось, если вы не заметили.

Добавлено через 1 минуту
Хотя, может быть и стоит так сделать.
0
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
14.09.2013, 21:31  [ТС]
Спс я понял если заменить (SR.Attr = faDirectory) then на (SR.Attr =faArchive)
то уже поиск не папок а файлов будет осуществляться?

И еще вопрос можно ли эти фапйлы выводить вместе с полными путями?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.09.2013, 21:55
Цитата Сообщение от NIKOLAYY Посмотреть сообщение
Спс я понял если заменить (SR.Attr = faDirectory) then на (SR.Attr =faArchive)
то уже поиск не папок а файлов будет осуществляться?
После такой замены будут найдены все файлы имеющие только атрибут faArchive и только они.

Добавлено через 5 минут
Чтобы "прояснить" ситуацию добавлю, что папка (каталог, директория) это файл с атрибутом faDirectory.
0
74 / 71 / 37
Регистрация: 10.09.2011
Сообщений: 169
14.09.2013, 23:39
NIKOLAYY,
Чтобы посмотреть файл ли нашелся:
Delphi
1
if (SR.Attr and $20) = $20 then
Для вывода с путями надо:
Delphi
1
str.Add('Directory = ' + SR.Name);
Заменить на:
Delphi
1
str.Add('Directory = ' + path+SR.Name);
Надеюсь, в этот раз ничего не напутал.
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
14.09.2013, 23:52
Цитата Сообщение от Rashiran Посмотреть сообщение
Чтобы посмотреть файл ли нашелся:
Delphi
1
if (SR.Attr and faDirectory) = 0 then
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.09.2013, 23:52
Помогаю со студенческими работами здесь

Поиск файлов на диске, за исключением скрытых файлов и папок
Часть кода, желательно использовать её. DirectoryInfo Di = new DirectoryInfo(@&quot;F:&quot;); foreach (FileInfo FileInfo in...

Поиск файлов и папок
Здравствуйте, можете пожалуйста подсказать как сделать поиск папок и файлов по определенному пути? например что находил файлы и папки...

Поиск папок и файлов по названию
Здравствуйте Уважаемые Форумчане! Подскажите пожалуйста, задача в том, чтобы по названию программы, обнаружить её присутствие, если...

Поиск и удаление файлов/папок
Здравствуйте. У меня такой вопрос! Как сделать bat файл, один из которых будет искать и удалять нужную папку а другой конкретный файл. ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru