Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
RAD 2009-XE2

Найти файлы по одному из всех директорий

02.08.2022, 00:10. Показов 2916. Ответов 43
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужно переделать процедуру GetAllFiles в функцию которая находит и возвращает директории к файлам
таким образом чтобы функция вытаскивала по одному файлу исходя из стартовой позиции integer.
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
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
var
from:Tstringlist;
 
....
procedure GetAllFiles(Path: string);
var
sRec: TSearchRec;
isFound: boolean;
begin
  isFound := FindFirst(Path + '\*', faAnyFile, sRec) = 0;
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attr and faDirectory) = faDirectory then
      GetAllFiles(Path + '\' + sRec.Name) else begin
      from.Add('\\?\' + ExpandFileName(Path + '\' + sRec.Name));
      Application.ProcessMessages;
      end;
    end;
    isFound := FindNext(sRec) = 0;
  end;
  FindClose(sRec);
end;
 
Пока сделал так работает кривовато:
 
var
Its:integer=0;
 
function GetAllFiles(Path: string;startpos:integer):string;
var
sRec: TSearchRec;
isFound: boolean;
begin
isFound := FindFirst(Path + '\*', faAnyFile, sRec) = 0;
while isfound do
 begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attr and faDirectory) = faDirectory then
      GetAllFiles(Path + '\' + sRec.Name,startpos) else begin
      Result:=('\\?\' + ExpandFileName(Path + '\' + sRec.Name));
      Application.ProcessMessages;
      end;
      end;
      if result<>'' then
      inc(Its);
      if its=startpos then
      break;
    isFound := FindNext(sRec) = 0;
  end;
  FindClose(sRec);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
dir:string;
int:integer;
begin
int:=5; // Задаётся начальная позиция файла здесь берём файл сразу под номером 5 
if SelectDirectory('Select Folder', '', dir) then
memo1.Lines.Add(GetAllfiles(dir,int));
end;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2022, 00:10
Ответы с готовыми решениями:

Удалить файлы из директорий по списку
Приветствую. Есть ряд директорий, допустим это D:\Dir1 D:\anydir C:\folder\anydir H:\Somewhere\something Для каждой...

Как открывать файлы из директорий случайным образом?
Как открывать случайные файлы из директории и делать чтения случайного любого файла из данной директорий к примеру у нас есть в папке три...

Извлечь все измененные файлы из разных директорий
Доброго времени суток друзья ;-) Назрел такой вопрос, хотя уже прошерстил все, что можно... :-) В общем ситуация думаю многим знакомая....

43
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
04.08.2022, 21:15  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AzAtom Посмотреть сообщение
Грубо говоря, может дать ответ, есть ли в директории заданное количество файлов, и ещё вернёт некое имя файла, которое может быть не постоянным.
Я всё от А до Я объяснил и разъяснил нужно выдирать файлы вместе с директорией в которой они лежат по одному используя счётчик integer, пока не наткнёмся на конец всех файлов
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
04.08.2022, 21:21
Не хочу никого обидеть, но мне эта переписка напомнила рассказ Альтова про муху.
1
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
04.08.2022, 23:19  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Не хочу никого обидеть, но мне эта переписка напомнила
Твои мысли заняты всем чем угодно кроме темы =)
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
05.08.2022, 00:27
Цитата Сообщение от Uefi220 Посмотреть сообщение
Твои мысли заняты всем чем угодно кроме темы =)
А по-моему пост Пытливый, как раз в тему. То решение, которое вы просите не имеет никакого смысла. А писать бессмысленный код никому не интересно.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 00:45  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
То решение, которое вы просите не имеет никакого смысла. А писать бессмысленный код никому не интересно.
Как не имеет смысла ? В памяти хранить 1000000 строк которые займут 300 мбайт или же по одному брать ?
Хотя у тебя похоже вся твоя жизнь смысла не имеет =)
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
05.08.2022, 01:13
Цитата Сообщение от Uefi220 Посмотреть сообщение
Как не имеет смысла ? В памяти хранить 1000000 строк которые займут 300 мбайт или же по одному брать ?
Не имеет смысла ваш вариант как именно брать по одному! Мне уже надоело повторять что индекс/счётчик это бред в общем случае. Никто вам не гарантирует что таким образом вы в окончательном результате получите список, в котором будут именно все файлы и не будет повторов.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 01:19  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
именно все файлы и не будет повторов.
Ну почему же не гарантирует всё можно брать по одному в других ЯП так и реализовано кстати !
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
05.08.2022, 01:29
Цитата Сообщение от Uefi220 Посмотреть сообщение
Да в многопоточке всё делаться будет просто inc(index)
А вот тут пожалуй ваш главный бред. Вы можете распараллелить выполнение каких-то вычислительных задач с помощью потоков. Ибо у вас несколько ядер процессора. Но вы не можете распараллелить чтение секторов диска. Ибо у вас на диске только одна группа головок.

Добавлено через 2 минуты
Цитата Сообщение от Uefi220 Посмотреть сообщение
Ну почему же не гарантирует всё можно брать по одному в других ЯП так и реализовано кстати !
Я не возражаю что можно брать по одному. Вопрос как именно брать по одному.
Ну и кстати. Если вы уже видели реализацию того что вы хотите на других ЯП, приведите ссылку. Мне бы очень хотелось посмотреть.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 01:53  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Я не возражаю что можно брать по одному. Вопрос как именно брать по одному.
Вообще всё равно как брать лишь бы брать чётко по одному !
0
пофигист широкого профиля
4770 / 3207 / 862
Регистрация: 15.07.2013
Сообщений: 18,615
05.08.2022, 02:13
Цитата Сообщение от Uefi220 Посмотреть сообщение
Вообще всё равно как брать лишь бы брать чётко по одному !
Опять бред. Ну нафига именно по одному в свете того что я написал о работе с диском в многопоточном режиме?
Вы можете понять что жесткий диск не работает мгновенно? Современные диски в персональных компьютерах работают в режиме 7200 об/мин. А это значит что средняя скорость чтения произвольного сектора диска 4-5 мс. Умножьте на ваш миллион файлов и получите в лучшем случае 40-50 минут.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 02:54  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
А это значит что средняя скорость чтения произвольного сектора диска 4-5 мс. Умножьте на ваш миллион файлов и получите в лучшем случае 40-50 минут.
Я не прошу открывать файлы мне надо только каталоги и подкаталоги со всеми файлами показать АЛЁ =)
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
05.08.2022, 04:05
Цитата Сообщение от Uefi220 Посмотреть сообщение
по одному используя счётчик integer, пока не наткнёмся на конец всех файлов
То есть, в директории 10000 файлов, задаём индекс 1, FindNext выполняется 1 раз и выдаёт имя. .... задаём индекс 9000, FindNext выполняется 9000 раз и функция выдаёт последний результат. Задаём индекс 9001 и функция FindNext выполняется 9001 раз... Ну это же бред!

Цитата Сообщение от Uefi220 Посмотреть сообщение
В памяти хранить 1000000 строк которые займут 300 мбайт или же по одному брать ?
То есть, хранить 1000000 файлов в одном каталоге - нормально, а выделить какие-то 300 мегабайт на список - уже жаба душит? Странно.... очень странно.

Цитата Сообщение от Uefi220 Посмотреть сообщение
мне надо только каталоги и существующие каталоги со всеми файлами показать
Тогда чем не устраивает обычный список файлов?

Добавлено через 1 минуту
Цитата Сообщение от Uefi220 Посмотреть сообщение
В памяти хранить 1000000 строк которые займут 300 мбайт
А они итак хранятся в памяти. Не будет же ОС для получения имени каждого файла делать чтение с диска? Всё в кэше.
1
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
05.08.2022, 15:01
Лучший ответ Сообщение было отмечено Uefi220 как решение

Решение

Вашу бы упертость да в правильном направлении. Вот вам ваша функция:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function GetFileName(FilePath: String; Index: Integer): String;
var
  FileInfo: TSearchRec;
begin
 Result := '';
 FilePath := IncludeTrailingPathDelimiter(FilePath);
 try
   if FindFirst(FilePath + '*.*', faAnyFile, FileInfo) <> 0 then Exit;
   var n := 0;
   repeat
     if (FileInfo.Name = '.') or (FileInfo.Name = '..') then Continue;
     if (FileInfo.Attr and faDirectory <> 0) then Continue;
     if n = Index then Exit(FilePath + FileInfo.Name);
     Inc(n);
   until FindNext(FileInfo) <> 0;
 finally
  FindClose(FileInfo);
 end;
end;
Использовать вы ее видимо будете примерно так:
Delphi
1
2
3
4
5
6
7
  var Index := 0;
  while True
  do begin
     var FileName := GetFileName('D:\Work\My\FileCollector\', Index);
     if FileName = '' then Break;
     Inc(Index);
     end;
Дерзайте. Возможно личный опыт сможет вас переубедить.
2
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.08.2022, 15:33
а что, System.IOUtils еще не изобрели ?
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
05.08.2022, 15:43
Цитата Сообщение от krapotkin Посмотреть сообщение
а что, System.IOUtils еще не изобрели ?
Нет, это массивы/списки на которые у ТС стойкая аллергия.
0
 Аватар для mr-Crocodile
3054 / 1673 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
05.08.2022, 16:35
Цитата Сообщение от Пытливый Посмотреть сообщение
Возможно личный опыт сможет вас переубедить.
Жду следующий пост от ТС - первые сто (тысячу, десять тысяч...) файлов находит быстро, а потом функция начинает тупить. Как её ускорить?!


Добавлено через 1 минуту
Цитата Сообщение от Uefi220 Посмотреть сообщение
В памяти хранить 1000000 строк которые займут 300 мбайт
Слушай, может тебе просто оперативку на компе нарастить?
Поставь себе побольше памяти и тогда 300 мегабайт тебе будет не так жалко, а?
1
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 17:25  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
Вот вам ваша функция:
Огромное спасибо вроде хорошо работает то что я и хотел только похоже во вложенных папках не ищет =)
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
05.08.2022, 18:25
И не должна искать, каталог откуда надо брать файл по индексу вы должны сами параметром задать. Вы же сами просите один файл по индексу, а это возможно сделать только из конкретного каталога.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
05.08.2022, 18:29  [ТС]
Цитата Сообщение от Пытливый Посмотреть сообщение
И не должна искать, каталог откуда надо брать файл по индексу вы должны сами параметром задать. Вы же сами просите один файл по индексу, а это возможно сделать только из конкретного каталога.
Вот как то так чтоли:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function GetFileName(FilePath: String; Index: Integer): String;
var
  FileInfo: TSearchRec;
  n:integer;
begin
 Result := '';
 FilePath := IncludeTrailingPathDelimiter(FilePath);
 try
   if FindFirst(FilePath + '\*', faAnyFile, FileInfo) <> 0 then Exit;
   n := 0;
   repeat
     if (FileInfo.Name = '.') and (FileInfo.Name = '..') then Continue;
     if (FileInfo.Attr and faDirectory <> 0) then Continue;
     if (FileInfo.Attr and faDirectory) = faDirectory then
     GetFileName(FilePath + '\' + FileInfo.Name, 0) else
     if n = Index then Exit('\\?\' + ExpandFileName(FilePath + FileInfo.Name));
     Inc(n);
   until FindNext(FileInfo) <> 0;
 finally
  FindClose(FileInfo);
 end;
end;
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
05.08.2022, 18:42
Можно изменить возвращаемый результат для большей гибкости.
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
26
27
function GetFileInfo(FilePath: String; Index: Integer; var FileInfo: TSearchRec): Boolean;
begin
 Result := False;
 FilePath := IncludeTrailingPathDelimiter(FilePath);
 if FindFirst(FilePath + '*.*', faAnyFile, FileInfo) <> 0 then Exit;
 var n := 0;
 repeat
   if (FileInfo.Name = '.') or (FileInfo.Name = '..') then Continue;
   if n = Index then Exit(True);
   Inc(n);
 until FindNext(FileInfo) <> 0;
end;
 
procedure TForm101.Button1Click(Sender: TObject);
begin
  var Index := 0;
  var FileInfo: TSearchRec;
  var Path := 'D:\Work\My\FileCollector\';
  while True
  do begin
     if not GetFileInfo(Path, Index, FileInfo) then Break;
     if FileInfo.Attr and faDirectory <> 0
     then Memo1.Lines.Add('(D)' + Path + FileInfo.Name)
     else Memo1.Lines.Add('(F)' + Path + FileInfo.Name);
     Inc(Index);
     end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2022, 18:42

Получить список всех директорий
Здравствуйте. Как можно получить список всех директорий и файлов? Можно ли это как нибудь делать без длинной цепочки из foreach'ей? ...

Скопировать из заданных директорий все файлы в указанную директорию
Здраствуйте !Вот такая у меня задача Скопировать из заданных директорий все файлы в указанную директорию. Если указанной директории не...

Удалить из указанных директорий файлы, имена которых соответствуют шаблону
Удалить из указанных директорий файлы, имена которых заданы шаблоном.

Вывести в формате ls информацию о содержимом всех директорий
оч нужно вот что: Напишите на C программу, которая выдает в формате ls информацию о содержимом всех директорий, содержащихся в пути от...

Снять ограничения всех директорий в C:/inetpub/wwwroot
Привет При публикации сайта оказалось, что файлы не читаются, из-за проблем с правами. Где именно ограничение, я не понял. ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru