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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2012, 21:34   #1
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
Вопрос Поиск файлов, ищет только если выбрать диск

Ищет файлы только если выбрать целый раздел, при выборе папки не ищет:
Код:
 procedure TSearcher.FindFile(Dir:String);
var
 i:integer;
 SR:TSearchRec;
 FindRes,ProdCount:Integer;
 Dir1,Dir2:string;
   fileExt:string;
begin
 ProdCount:=0;
 FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR);
 while FindRes=0 do
  begin
   if ((SR.Attr and faDirectory)=faDirectory) and
   ((SR.Name='.')or(SR.Name='..')) then
     begin
      FindRes:=FindNext(SR);
      Continue;
     end;
 
   if ((SR.Attr and faDirectory)=faDirectory) then
    begin 
     FindFile(Dir+SR.Name+'\');
     FindRes:=FindNext(SR);
   
     Continue; 
    end;
     inc(ProdCount);
     Inc(AlleMedia);
                 { Dir+ }
    FileExt:=ExtractFileExt(SR.name);
        if IsValideMedia(fileext)then       
      Rpl.Items.Add(SR.Name);   
      end;    
   if Application.Terminated then Break;
   Application.ProcessMessages;
   FindRes:=FindNext(SR);
  end;
  
 FindClose(SR);
end;

procedure TSearcher.Button1Click(Sender: TObject);
var
  TitleName : string;
  lpItemID : PItemIDList;
  BrowseInfo : TBrowseInfo;
  DisplayName : array[0..MAX_PATH] of char;
  TempPath : array[0..MAX_PATH] of char;
begin
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  BrowseInfo.hwndOwner := Searcher.Handle;
  BrowseInfo.pszDisplayName := @DisplayName;
  TitleName := 'Please specify a directory';
  BrowseInfo.lpszTitle := PChar(TitleName);
  BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
  lpItemID := SHBrowseForFolder(BrowseInfo);
  if lpItemId <> nil then
  begin
  SHGetPathFromIDList(lpItemID, TempPath);
   FindFile(TempPath);
   Caption:=TempPath;
    GlobalFreePtr(lpItemID);
  end;

end;
в чем же беда ?
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 26.09.2012, 02:02   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Если версия Delphi относительно новая (начиная с 2010), то можно посмотреть на вот такие возможности: 1 и 2
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 26.09.2012, 13:21   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

При первом входе в процедуру поиска нет символа \ на конце, поэтому либо в начале процедуры надо проверять
Код:
if Dir[Length(Dir)]<>'\' then Dir := Dir + '\';
либо в процедуре клика добавить этот слеш

Можно так не усложнять вызов диалога выбора каталогов
Код:
uses FileCtrl;
...
if SelectDirectory('Выберите папку...','',s) then FindFile(s);
Забыл сказать, что в
Код:
FileExt:=ExtractFileExt(SR.name);
        if IsValideMedia(fileext)then       
      Rpl.Items.Add(SR.Name);   
      end;
end лишний

Последний раз редактировалось eoln; 26.09.2012 в 13:24.
eoln вне форума Ответить с цитированием
Старый 26.09.2012, 13:36   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

eoln, разрешите Вас поправить:
Код:
if Dir[Length(Dir)]<>'\' then Dir := Dir + '\';
лучше так
Код:
IncludeTrailingPathDelimiter(Dir);
phomm вне форума Ответить с цитированием
Старый 26.09.2012, 13:45   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

phomm, согласен - так лучше и кроссплатформнее
eoln вне форума Ответить с цитированием
Старый 26.09.2012, 21:08   #6
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
При первом входе в процедуру поиска нет символа \ на конце, поэтому либо в начале процедуры надо проверять
Код:
if Dir[Length(Dir)]<>'\' then Dir := Dir + '\';
либо в процедуре клика добавить этот слеш
Спасибо, родина вас незабудет.
Тоже про недостающий слеш думал но к TempPath : array[0..MAX_PATH] of char; его добавить неудалось, а в процедуре поиска там можно все запартачить если не там дописать.
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 26.09.2012, 21:47   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Функа IncludeTrailingBackslash
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивный поиск файлов в интервале дат(без времени,только день,месяц и год)) AlexKhol Общие вопросы Delphi 3 04.02.2012 16:15
Функция ЕСЛИ подходит только для 1 условия, а если условий больше? Slavatron1984 Microsoft Office Excel 2 08.01.2012 22:07
Группы символов, состоящие только из латинских букв, если первая буква группы входит в нее еще только оди Ela Помощь студентам 0 29.04.2010 13:41
Одни из jpg файлов реальные JPEG а другие только название. как загрузиь только картинки? AgressiveBehavior Общие вопросы Delphi 1 16.09.2009 09:39