Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 21:49   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да, ты правильно понял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2012, 12:43   #12
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Да, ты правильно понял.
Ну а теперь надо покапатся в FirstFind.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 21.11.2012, 12:58   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зачем в чём-то копаться то?!!
Вам же уже почти готовый код скинули (хотя Вы такой же (аналогичный) код легко поиском по форуму могли найти). Добавьте глобальные переменные-счётчики. В них подсчитывайте файлы/папки. Если нужно куда-то сохранять имена файлов/папок, то рекомендую воспользоваться объектом класса TStringList... и всё. и не надо копаться в FindFirst!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2012, 13:06   #14
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Есть в модуле такие коды к этой функции:
Код:
  faReadOnly  = $00000001 platform;
  faHidden    = $00000002 platform;
  faSysFile   = $00000004 platform;
  faVolumeID  = $00000008 platform;
  faDirectory = $00000010;
  faArchive   = $00000020 platform;
  faSymLink   = $00000040 platform;
  faAnyFile   = $0000003F;
И мой код:
Код:
Tin1:=FindFirst(gPath,faDirectory, SR);
Показывает: 0.
Почему?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 21.11.2012, 13:10   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Правильно делает:
Код:
 FindFirst returns 0 if a file was successfully located
Далее так:
Код:
if FindFirst(gPath,faDirectory, SR)=0 then
repeat
 тут чето с SR.Name делаем
until FindNext(sr)<>0
FindClose(sr);
Еще такая ремарка - первые два каталога (. и ..) можно пропустить
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2012, 13:14   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
if FindFirst(gPath,faDirectory, SR)=0 then
не очень надёжный код. Если у директории будет стоят любой другой из аттрибутов (системная, скрытая, архивная и т.д.) этим кодом она найдена НЕ БУДЕТ!

саша40, повторю вопрос. Чем предложенный код Вас не устроил?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.11.2012, 14:07   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не очень надёжный код
Ну добавить атрибуты по вкусу - будет понадежнее
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2024, 18:08   #18
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,826
По умолчанию

На форме окно вывода Memo и Кнопка.
Код:
unit SizeFolders;
interface
uses Forms,Classes,Controls,StdCtrls,SysUtils;

function ShowWindow(hWnd:LongWord;CmdShow:Integer):LongBool;stdcall;external 'user32.dll' name 'ShowWindow';

type TForm1=class(TForm)
     Memo1:TMemo;
     Button1:TButton;
     procedure PrintDirect(Put:string);
     procedure Button1Click(Sender:TObject);
     private{Private declarations}
     public{Public declarations}
end;

const N=1000000;
var Form1:TForm1;
    z,z0:LongInt;
    Name1:array[1..N]of string;
implementation
{$R *.DFM}

//----- выводим пути на конкретном диске ---------------------------------------
procedure TForm1.PrintDirect(Put:string);
var i,j,k,m1,m2:LongInt;
    SR:TSearchRec;
begin
   for i:=1 to N do Name1[i]:='';//очищаем массивы путей
   //----- ищем пути -----------------------------------------------------------
   Name1[1]:=Put;//начинаем искать с нашего диска
   z:=1;
   z0:=0;
   m1:=1;
   m2:=1;
   j:=0;    
   while(0<1) do//бесконечный цикл, пока...
   begin
      inc(j);
      if(j=1)then z:=1;//один путь уже есть точно - сам диск
      z0:=z;//запоминаем прежнее число.
      for i:=m1 to m2 do
      begin
         k:=z;//число предыдущих путей,с него и начинаем счёт
         if(FindFirst(Name1[i]+'*',$0000003F,SR)=0)then//ищем любую папку или файл
         repeat
            if(SR.Name<>'.')and(SR.Name<>'..')and(FileExists(Name1[i]+SR.Name)=False)then//отсеиваем файлы
            begin
               inc(k);
               Name1[k]:=Name1[i]+SR.Name+'\';
            end;
         until FindNext(SR)<>0;
         z:=k;//число новых папок
         FindClose(SR);
      end;
      m1:=m2+1;
      m2:=z;
      Application.Title:='глубина '+IntToStr(j)+', '+'папок '+IntToStr(z);
      if(z0=z)then break;
   end;
   Form1.Caption:='Найдено папок '+IntToStr(z);
end;

procedure TForm1.Button1Click(Sender:TObject);
var tm1,tm2:Extended;
    i:LongInt;
begin
   Memo1.Clear;
   ShowWindow(Application.Handle,6);//SW_MINIMIZE
   tm1:=86400*Time;
   PrintDirect('C:\');//ищем все папки
   tm2:=86400*Time;
   ShowWindow(Application.Handle,1);//SW_NORMAL
   for i:=1 to z do Memo1.Lines.Add(IntToStr(i)+'     '+Name1[i]);
   Memo1.Lines.Add(FloatToStr((Round((tm2-tm1)*1000))/1000)+' сек.');
end;

end.
//вместо моего стартового пути C:\ можно вписать свою папку, например D:\фильмы\новое\
а в условии цикла вместо бесконечного условия можно задать глубину поиска папок
Код:
while(j<=3) do//глубина поиска  3 папки
за 2,57 секунд на Win 7 Ultimate находит на диске C\: все 7043 папки. выводит в Memo немного дольше.
На Win 10 за 3-8 секунды находит более 27.000 папок.
пытался ещё как-то более причесать код и сделать более быстрым саму процедуру поиска, но не смог. на ассемблер его перевести что ли?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 07.01.2024 в 18:11.
NetSpace вне форума Ответить с цитированием
Старый 08.01.2024, 17:00   #19
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

В наше время проще использовать GetFiles, чем FindFirst и FindNext
FaTaL вне форума Ответить с цитированием
Старый 08.01.2024, 18:34   #20
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,826
По умолчанию

я посмотрел GetFiles() в исходнике IOUtils.pas. те же процедуры, красиво упрятанные в оболочки, чтоб было меньше мороки у начинающих программистов. может и имеет смысл, когда только учишься...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файлы и папки X@OC Общие вопросы Delphi 2 13.09.2011 21:18
Поиск папки по имени в директории artemavd Общие вопросы Delphi 4 06.08.2010 08:18
Прога не очет искать директории. А вот файлы нрмально ищет. TwiX Общие вопросы C/C++ 3 18.03.2010 04:17
Как узнать все папки в указаной директории? blackstersl Общие вопросы Delphi 4 17.06.2009 13:23
Выбрать имя папки из директории Македонский Общие вопросы Delphi 15 29.08.2007 10:48