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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2012, 22:24   #1
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию Программное получение имени файлов в папке

Привет. Есть код:
Код:
var
SR: TSearchRec;
Tin: integer;
s: boolean;
i: integer;
begin
s:=false;
gPath:='';
if SelectDirectory('Выбирите папку', '', gPath) then
s:=true 
else
exit;
if gPath<>'' then 
begin
Tin:=FindFirst(gPath,faArchive,SR); 
For i:=1 To Tin Do
begin
ListBox2.Items.Add(gPath + '\' + SR.Name);
ListBox1.Items.Add(SR.Name);
end;
FindClose(SR);
end;
end;
Почему-то получается найти только пустое имя(тоесть = ''). Вопрос: Как тогда найти настоящие имя?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось саша40; 23.11.2012 в 22:34.
саша40 вне форума Ответить с цитированием
Старый 23.11.2012, 22:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
For i:=1 To Tin Do
Это что? FindFirst не возвращает количество файлов. По сути это итератор, который каждый раз при вызове собрата FindNext возвращает следующий файл в каталоге, но никак не все сразу списком.

Кстати стесняюсь спросить: Эта тема (http://www.programmersforum.ru/showt...=218592&page=2) ничем не помогла?
I'm learning to live...

Последний раз редактировалось Stilet; 23.11.2012 в 22:35.
Stilet вне форума Ответить с цитированием
Старый 23.11.2012, 22:35   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это что? FindFirst не возвращает количество файлов. По сути это итератор, который каждый раз при вызове собрата FindNext возвращает следующий файл в каталоге, но никак не все сразу списком.
ммм. тогда как сделать правильно, что-то не пойму?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 23.11.2012, 23:12   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Посмотри внимательно мой пост №15.
Сначала вызывается FindFirst, который создает итератор (переменную принимающую на каждом витке цикла очередное его значение, и косвенно указывающую на следующее значение). В примере итератор - SR. Если итератор создан, т.е. каталог существует то результат функции будет SUCCESS равный нулю. Если происходит ошибка - результатом является код ошибки, который с помошью SysErrorMessage можно превратить в строку и почитать.
Далее идет цикл, где твоя программа колдует над очередным полем итератора по имени Name. Это имя файла.
После чего until вызывает следующую итерацию при помоши FindNext продолжая поиск, выбирая в итератор следующий файл (его описание), и так пока FindNext не вернет значение не равное нулю - это значит файлов более нет, или каталог поврежден.

Таким образом работают генераторы FindFirst...FindNext, возвращая новый элемент поочередно но никак не сразу всем скопом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.11.2012, 00:03   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Тс, http://www.delphibasics.ru/
Прочитайте там о FindFirst, FindNext, FindClose и ваши проблемы решатся...
Человек_Борща вне форума Ответить с цитированием
Старый 24.11.2012, 11:13   #6
sariman
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 58
По умолчанию

Держите:
Код:
procedure GetAllFiles(Path: string);
var
  sRec: TSearchRec;
  isFound: Boolean;
begin
  isFound := FindFirst(Path + '\*.*', faAnyFile, sRec) = 0;
  Path := IncludeTrailingPathDelimiter(Path);
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attr and faDirectory) = faDirectory then
        GetAllFiles(Path + sRec.Name, ListBox);
      ListBox1.Items.Add(sRec.Name);
      ListBox2.Items.Add(Path + sRec.Name);
    end;
    Application.ProcessMessages;
    isFound := FindNext(sRec) = 0;
  end;
  FindClose(sRec);
end;
sariman вне форума Ответить с цитированием
Старый 25.11.2012, 18:54   #7
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от sariman Посмотреть сообщение
Держите:
Код:
procedure GetAllFiles(Path: string);
var
  sRec: TSearchRec;
  isFound: Boolean;
begin
  isFound := FindFirst(Path + '\*.*', faAnyFile, sRec) = 0;
  Path := IncludeTrailingPathDelimiter(Path);
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attr and faDirectory) = faDirectory then
       
      ListBox1.Items.Add(sRec.Name);
      ListBox2.Items.Add(Path + sRec.Name);
    end;
    Application.ProcessMessages;
    isFound := FindNext(sRec) = 0;
  end;
  FindClose(sRec);
end;
Спасибо. Но тут похоже должно писатся так:
Код:
GetAllFiles(gPath + sRec.Name);
Но есть проблема, после добавления папки в плейлист(или куда ещё), не может воспроизвести файл, вопрос: Почему?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 25.11.2012, 18:57   #8
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Спасибо. Но тут похоже должно писатся так:
Код:
GetAllFiles(gPath + sRec.Name);
Но есть проблема, после добавления папки в плейлист(или куда ещё), не может воспроизвести файл, вопрос: Почему?
нет сори всё робит. Спасибо огромное. Отзыв написал. Буду продолжать. Кстати:
Код:
Application.ProcessManager;
Я закоментил, может его обратно раскоментить?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 25.11.2012, 19:12   #9
sariman
Пользователь
 
Регистрация: 06.01.2012
Сообщений: 58
По умолчанию

Если эту строку убрать, приложение может не реагировать на действия пользователя, пока весь список не загрузится.
sariman вне форума Ответить с цитированием
Старый 25.11.2012, 19:17   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от sariman Посмотреть сообщение
Если эту строку убрать, приложение может не реагировать на действия пользователя, пока весь список не загрузится.
Тоесть если я её раскоменчу, то пока список не закончится приложение не будет реагировать, верно?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти файл в папке, если в имени папки есть точка? Zis67 Общие вопросы Delphi 9 03.10.2012 20:32
Проверка наличия файла в папке по имени strannick Microsoft Office Excel 6 07.07.2012 18:04
Получение имени пользователя Ellienn Microsoft Office Excel 18 31.08.2011 08:24
Получение имени окна Artem Общие вопросы Delphi 4 20.09.2007 16:38
Отслеживает появление в папке файлов. слежение за определенным файлом в определенной папке. RammFan Win Api 1 09.06.2007 11:09