Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск файлов. 
V
    Опции темы
ivan219
Дата 16.10.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Код.
Код

procedure FindPlugin;
var
   SearchRec:TSearchRec;
   Dir:String;
begin
 Dir:='Plugin';
 try
   if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);
   if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
    repeat
     if (SearchRec.name='.') or (SearchRec.name='..') then continue;
     if (SearchRec.Attr and faDirectory)=0 then
      if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.DLL' then
       begin
        CaptionPlugin:=SearchRec.name;
        if LoadLib(PChar(Dir+SearchRec.name)) then RecordMenu;
       end;
    until FindNext(SearchRec)<>0;
 finally
   FindClose(SearchRec);
 end;
end;

Обясните мне зачем тут нужна
Код

 if Dir<>'' then Dir:=IncludeTrailingPathDelimiter(Dir);

и ещё в каком порядке всё это дело ищит файлы т.е. как по имени по дате создания или ещё как smile

Добавлено @ 22:58 
И ещё может кто распишет этот код а то я непонемаю что к чему smile 

Это сообщение отредактировал(а) ivan219 - 16.10.2006, 22:56
PM MAIL ICQ   Вверх
Yanis
Дата 16.10.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



ivan219
Как-то ты странно пытаешься разобраться... Вроде всё просто...
Процедура ищет все файлы (маска '*.*') путём простого рекурсивного перебора.

Цитата(ivan219 @  16.10.2006,  23:54 Найти цитируемый пост)
Обясните мне зачем тут нужна

А справку прочитать? Функция проверяет оканчивается ли строка на '\' (для винды) и добавляет обратный slash,  если нет.

Цитата(ivan219 @  16.10.2006,  23:54 Найти цитируемый пост)
И ещё может кто распишет этот код а то я непонемаю что к чему

В каком месте ты непонимаешь что к чему?

Это сообщение отредактировал(а) Yanis - 16.10.2006, 23:29


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Демо
Дата 16.10.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Цитата(ivan219 @  16.10.2006,  22:54 Найти цитируемый пост)
Обясните мне зачем тут нужна


Автор этого кода взял готовую функцию, криво передрал. А ты изучаешь ;)

Код

function GetFilesSimple(const FilePath,Mask: String; List: TStrings): Integer;
var
  SR: TSearchRec;
  tPath: String;
begin
{$WARN SYMBOL_PLATFORM OFF}
  Result := 0;
  tPath := IncludeTrailingBackSlash(FilePath);
  if FindFirst(tPath+'*.*',faAnyFile,SR)<>0 then Exit;
  repeat
    if (SR.Name='.') or (SR.Name='..') then Continue;
    if (SR.Attr and faDirectory)=0 then
    begin
      if not MatchesMask(SR.Name,Mask) then Continue;
      List.Add(tPath+SR.Name);
      Inc(Result);
    end
    else Inc(Result,GetFilesSimple(tPath+SR.Name,Mask,List));
  until FindNext(SR)<>0;
  Sysutils.FindClose(SR);
{$WARN SYMBOL_PLATFORM ON}
end;




--------------------
    
PM MAIL ICQ Skype   Вверх
ivan219
Дата 17.10.2006, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Yanis @  16.10.2006,  23:28 Найти цитируемый пост)
 путём простого рекурсивного перебора.

Это как smile 
Цитата(Yanis @  16.10.2006,  23:28 Найти цитируемый пост)
В каком месте ты непонимаешь что к чему?

Ну что какая функция зачто отвечает какие пораметры и.т.д.
Цитата(Yanis @  16.10.2006,  23:28 Найти цитируемый пост)
А справку прочитать?

Я так и зделал но уменя нет переводчика так что нечего не понял smile 

Цитата(Демо @  16.10.2006,  23:38 Найти цитируемый пост)
Автор этого кода взял готовую функцию, криво передрал. А ты изучаешь ;)

Да похожи но там TStrings а он мне ненужен.


PM MAIL ICQ   Вверх
~FoX~
Дата 17.10.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(ivan219 @  17.10.2006,  01:25 Найти цитируемый пост)
Это как smile 

Это когда функция вызывает сама себя или собственный кусок. Тока вот какая она то не рекурсивная, да и не функция нифига...

Цитата(ivan219 @  17.10.2006,  01:25 Найти цитируемый пост)
Ну что какая функция зачто отвечает какие пораметры и.т.д.


Код

try {пробуем}
   if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then {ищем первый файл удовлитворяющий условию}
    repeat {повторям}
     if (SearchRec.name='.') or (SearchRec.name='..') then continue; {если каталог верхнего уровня или предыдущего уровня, тогда просто идем дальше}
     if (SearchRec.Attr and faDirectory)=0 then {если директория топаем дальше}
     if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.DLL' then  {если расширение .DLL}
       begin
        CaptionPlugin:=SearchRec.name; {Пишем в CaptionPlugin имя файла}
        if LoadLib(PChar(Dir+SearchRec.name)) then RecordMenu; {тут какуюто фигню делаем}
       end;
    until FindNext(SearchRec)<>0; {повторям пока не переберем все файлы}
 finally {если что то грохнулось или наоборот не грохнулось, то все завиршаем}
   FindClose(SearchRec); {завиршаем все нафиг}


Корявая процедурка!

Это сообщение отредактировал(а) ~FoX~ - 17.10.2006, 14:26


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
ivan219
Дата 17.10.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



~FoX~, спасибо.

А можно не корявую процедуру посмотреть smile 

Так как мне надо искать всего в одной папке фаилы с расширением Dll
PM MAIL ICQ   Вверх
Zero
Дата 17.10.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: 8
Всего: 24



Цитата(ivan219 @  17.10.2006,  21:39 Найти цитируемый пост)
А можно не корявую процедуру посмотреть 


ivan219, я не понял чё именно ты хочешь, чтобы обязательно твоя процедура была переделана или тебе просто 
Цитата(ivan219 @  17.10.2006,  21:39 Найти цитируемый пост)
Так как мне надо искать всего в одной папке фаилы с расширением Dll 

Если второе то вот так как ты видел в DRKB:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  If FindFirst('c:\Windows\AppPatch\*.*', faAnyFile, SearchRec)=0 then
    repeat
      if copy(SearchRec.Name,pos('.',SearchRec.Name)+1,length(SearchRec.Name)) = 'dll' then
        memo1.Lines.Add(SearchRec.Name);
    until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;


PS: он ищет все длл-ки в каталоге "c:\Windows\AppPatch\"

Добавлено @ 21:26 
Если ты хочешь разобраться именно в той которая написана в первом твоём посте, то говори конкретно чё тебе не понятно... Хотя ~FoX~ вроде более менее smile  описал...

Добавлено @ 21:32 
Цитата(Yanis @  17.10.2006,  00:28 Найти цитируемый пост)
Вроде всё просто...
Процедура ищет все файлы (маска '*.*') путём простого рекурсивного перебора.


Yanis там нет не какой рекурсии. Когда обясняешь опытным-новичкам, то желательно немного конектить с терминологие... smile 
PM MAIL ICQ   Вверх
Yanis
Дата 17.10.2006, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Zero @  17.10.2006,  22:24 Найти цитируемый пост)
Yanis там нет не какой рекурсии. Когда обясняешь опытным-новичкам, то желательно немного конектить с терминологие...

Эт я поспешил smile Просто код постоянно в форуме светиться. Наверное из-за этого.
Да и вопросы какие-то... smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
ivan219
Дата 17.10.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Yanis @  17.10.2006,  21:35 Найти цитируемый пост)
Да и вопросы какие-то...

Самые простые smile 

Хотя помойму разобрался smile 
PM MAIL ICQ   Вверх
ivan219
Дата 18.10.2006, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Маленькое дополнение к коду в этом случае будут видны все расширения dll,DLL,Dll....
Код

.
.
if LowerCase(copy(SearchRec.Name,pos.....
.
.

PM MAIL ICQ   Вверх
Демо
Дата 18.10.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Вот блин. Ну что тут непонятного?

Код

function GetFilesSimple(const FilePath): Integer;
var
  SR: TSearchRec;
  tPath: String;
begin
{$WARN SYMBOL_PLATFORM OFF} //Подавляем предупреждение о многоплатформенности
  Result := 0;
  tPath := IncludeTrailingBackSlash(FilePath); //Добавляем слеш в конец
  if FindFirst(tPath+'*.*',faAnyFile,SR)<>0 then Exit;
  repeat
    if (SR.Name='.') or (SR.Name='..') then Continue;
    if (SR.Attr and faDirectory)=0 then
    begin
      if not MatchesMask(SR.Name,'*.dll') then Continue;
      try
        if LoadLib(tPath+SR.Name) then RecordMenu;
      except
//Здесь обрабатываем ошибку, если произошла
      end;
      Inc(Result);
    end;
  until FindNext(SR)<>0;
  Sysutils.FindClose(SR);
{$WARN SYMBOL_PLATFORM ON}
end;



--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 18.10.2006, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Демо @  18.10.2006,  08:52 Найти цитируемый пост)
Вот блин. Ну что тут непонятного?

Я тоже этим вопросом задаюсь. Вижу что ivan219 разбирается, но почему застревает в таких местах -- непонятно.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
~FoX~
Дата 18.10.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(~FoX~ @  17.10.2006,  15:23 Найти цитируемый пост)
 if AnsiUpperCase(ExtractFileExt(SearchRec.name)) = '.DLL' then

А не проще 
Код

FindFirst(Dir+'*.DLL', faAnyFile, SearchRec)

Финды не чувствительны к регистру.

Добавлено @ 08:17 
[/code]
Цитата(ivan219 @  17.10.2006,  21:39 Найти цитируемый пост)
А можно не корявую процедуру посмотреть smile 


Можно:
Код

procedure GetFile(Dir: string; ras: string); //Dir - путь в котором искать ras - расширение в формате '/*.DLL'
var
  f : TSearchRec; //Структура такая, в ней храниться все о найденом файле
  i : integer;
  FPath, SPath : TStrigList; //полный путь и просто название файла
begin
  FPath := TStringList.Create; // Создаем листы
  SPath := TStringList.Create; 
  i := FindFirst(Dir+ras, faAnyFile, f); //Находим первый файл
  while (i=0) do  begin  //Повторяем поиск пока фалы не кончаться
     FPath.Add(Dir+f.Name); //Полный путь к фалу
     SPath.Add(f.Name); // Название файла
     i := FindNext(f); //Ищем слдующий
     Application.ProcessMessages; //Чтоб не тормазило
  end; //while
  FindClose(f); //Закрываем наш поиск
end;


Вызывается так: 
Код

GetFile('c:\MyPapkaDlyaPoicka\', '\*.DLL');



Это сообщение отредактировал(а) ~FoX~ - 18.10.2006, 08:19


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Yanis
Дата 18.10.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(~FoX~ @  18.10.2006,  09:09 Найти цитируемый пост)
Финды не чувствительны к регистру.

Финды нет, а pascal да smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
~FoX~
Дата 18.10.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(Yanis @  18.10.2006,  09:18 Найти цитируемый пост)
Финды нет, а pascal да smile 

(фИнды, а не финдЫ)  smile 

Я имел ввиду FindFirst((Dir+'*.DLL', faAnyFile, SearchRec) тоже самое что FindFirst((Dir+'*.dLl', faAnyFile, SearchRec)  


Это сообщение отредактировал(а) ~FoX~ - 18.10.2006, 08:23


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.