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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2009, 22:55   #1
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию Как сканировать папки и подпапки?

Использую вот такую функцию
Код:
function GetFiles(Path:String; Full: Boolean = False):TStrings;
   Var
   Rec:TSearchRec;
   TMP:TStrings;
   ls,ex: String;
   i: integer;
   ok: integer;
begin
Result:=TStringList.Create;
if Path[Length(Path)]<>'\' Then Path:=Path+'\';
  //ChDir(Path);
ok:=FindFirst(Path+'\*.*',faAnyFile,Rec);
while ok=0 do
begin
if (Rec.Name<>'.')and(Rec.Name<>'..') then
if (Rec.Attr and faDirectory) <> 0 then begin
TMP:=GetFiles(Path+Rec.Name,True);
Result.AddStrings(TMP);
TMP.Free;
end else
begin
ex:=ExtractFileExt(Rec.Name);
if (ex='.mp3') or (ex='.wav') or (ex='.ogg') or (ex='.wma')  then
Result.Add(Path+Rec.Name);
end;
ok:=FindNext(Rec);
end;
end;
Пример
Код:
ListBox2.Items.AddStrings(GetFiles('C:\music'))

Все в принципе работает. Но можно ли сделать так:
Если я написал не путь к папке, а путь к файлу чтобы он его не игнорировал, а помещал в ListBox2? Что надо изменить?
Anfall вне форума Ответить с цитированием
Старый 17.03.2009, 06:53   #2
Andrei
Форумчанин
 
Регистрация: 20.06.2007
Сообщений: 270
По умолчанию

Перед вашим кодом:

Код:
if Length(ExtractFileName(Path))>0 then
begin
 //Path - это, предположительно, имя файла. Пишем нужный обработчик.
 ......
end;
-Кукушка, кукушка! Накукуй мне сто лет!
-А накукуй тебе столько?

(с) Библия. Вольный перевод с древнееврейского.
Andrei вне форума Ответить с цитированием
Старый 17.03.2009, 09:40   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

можно так:
Код:
MyPath := 'C:\Music\lalala.mp3';
if FileExists(MyPath) then
  ListBox2.Items.Add(MyPath)
else
  ListBox2.Items.AddStrings(GetFiles(MyPath));
p.s. меня мучают смутные сомнения...
в процедуре GetFiles создаётся TStringList (Result:=TStringList.Create
но я в упор не вижу, где он удаляется.... :-( Это утечки памяти ;-(

Последний раз редактировалось Serge_Bliznykov; 17.03.2009 в 09:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.03.2009, 11:18   #4
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Может так?
Код:
function IsMyFile(FileName: String): Boolean;
var
  ex: String;
begin
  ex:=ExtractFileExt(FileName);
  Result := ((ex='.mp3') or (ex='.wav') or (ex='.ogg') or (ex='.wma'));
end;

procedure GetFilesList(Path: String; ResList: TStrings; Recursive: Boolean = False; NewList : Boolean = True);
Var
  Rec:TSearchRec;
  ok: integer;
begin
  if not Assigned(ResList) then
    raise Exception.Create('ResList is Nil');

  if NewList then
    ResList.Clear;

  if FileExists(Path) then
  begin
    if IsMyFile(Path)  then
      ResList.Add(Path);
    exit;
  end else
    if not DirectoryExists(Path) then
      raise Exception.Create('Path задан неверно');

  Path := IncludeTrailingPathDelimiter(Path);

  ok:=FindFirst(Path+'*.*',faAnyFile,Rec);
  while ok=0 do
  begin
    if (Rec.Name<>'.')and(Rec.Name<>'..') then
      if Recursive or ((Rec.Attr and faDirectory) = 0) then
      begin
        GetFilesList(Path+Rec.Name, ResList, True, False);
      end;
    ok:=FindNext(Rec);
  end;
end;

// пример использования
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetFilesList(ExtractFilePath(Application.ExeName), ListBox1.Items, True, True);
end;
s.Creator вне форума Ответить с цитированием
Старый 17.03.2009, 15:03   #5
Anfall
Форумчанин
 
Регистрация: 10.02.2009
Сообщений: 181
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
можно так:
Код:
MyPath := 'C:\Music\lalala.mp3';
if FileExists(MyPath) then
  ListBox2.Items.Add(MyPath)
else
  ListBox2.Items.AddStrings(GetFiles(MyPath));
p.s. меня мучают смутные сомнения...
в процедуре GetFiles создаётся TStringList (Result:=TStringList.Create
но я в упор не вижу, где он удаляется.... :-( Это утечки памяти ;-(
Хммм. Спасибо, и как эти утечки "Удалить"?
Anfall вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
какой функцией сканировать папки andru15 Общие вопросы C/C++ 0 30.11.2008 20:22
Как обработат файлы из папки? ne4aJIb Помощь студентам 3 04.10.2008 14:34
Как узнать расположение папки мои документы? apromix Win Api 4 08.05.2008 15:04
Как получить содержимое папки ? - fenix - Помощь студентам 4 19.04.2008 06:25
Как найти размер папки! vitalik007 Общие вопросы Delphi 6 02.02.2008 14:29