Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/63: Рейтинг темы: голосов - 63, средняя оценка - 4.94
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1

FindFirst список файлов

11.05.2011, 03:56. Показов 13285. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
TSearchRec Folder;
        char Katalog [100][100];
        int ScrollSearch;
        int Counter=0;
\\переменные
C++
1
2
3
4
5
6
7
ScrollSearch = FindFirst("*.*",faDirectory, Folder);
                while (ScrollSearch==0)
                {
                strcpy(Katalog[Counter], Folder.Name.c_str());
                ScrollSearch = FindNext(Folder);
                Counter++;
                }
Проблема: когда вывожу список файлов в Memo, то первые две(одна) строчки, заняты точками: "." и ".."
Предполагаю, что это как то связано с папкой, в которой ищет файлы. что место самой папки ставить пару точек. Как от этого можно избавится?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2011, 03:56
Ответы с готовыми решениями:

поиск файлов (findfirst, findnext)
Здравствуйте, вот пробую написать программу для поиска всех файлов( по маске *.*) определенной папки нашел вот такой пример, но он не...

Поиск файлов с помощью FindFirst и FindNext дает лишние файлы
Всем привет!!! Столкнулся с такой ситуацией, что в FindFirst, FindNext попадают лишние файлы ... FindFirst(path+fileFormat,...

FindFirst. Поиск во всех поддиректориях, всех файлов
Не получается рекурсивно вызвать 1ую процедуру, почему-то только для первой папки ищет все файлы. unit Unit2; interface ...

18
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.05.2011, 04:51
там условие надо при выводе, типа:
C++
1
if (Name!="."&&Name!="..")
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
11.05.2011, 08:36  [ТС]
не помогло, написал и в составлении списка, и при его показе.
Миниатюры
FindFirst список файлов  
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.05.2011, 08:38
В условии вместо || надо &&
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
11.05.2011, 08:41  [ТС]
и этот способ с && не прошел.
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.05.2011, 08:50
Это 100% рабочий код:
C++
1
if ((Folder.Name!=".")&&(Folder.Name!=".."))
1
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
11.05.2011, 09:02  [ТС]
благодарю, что постарался, но прога от такова условия, зависло намертво))
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.05.2011, 09:06
Цитата Сообщение от magals Посмотреть сообщение
благодарю, что постарался, но прога от такова условия, зависло намертво))
Значит ошибка где-то в другом месте
1
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
11.05.2011, 09:15  [ТС]
вот прога целиком, со всеми кишками. посмотрите пожалуйста что не так.
Инструкция: прога выбирает рандомные файлы из заданой директории(пока что будет брать из своей папки), зависимо какой предел по объёму поставили или пока не закончится цикл из 50.
Вложения
Тип файла: rar RandoFiles2.rar (367.5 Кб, 57 просмотров)
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
11.05.2011, 09:24
У вас зацикливалось на 1 элементе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        ScrollSearch = FindFirst("*.*",faDirectory, Folder);
                while (ScrollSearch==0)
                {
                        //if(Folder.Name.c_str() != "." && Folder.Name.c_str() != "..")
                        if ((Folder.Name!=".")&&(Folder.Name!=".."))
                        {
                        strcpy(Katalog[Counter], Folder.Name.c_str());
                        MassSize[Counter]= Folder.Size;
                        ScrollSearch = FindNext(Folder);
                        Counter++;
                        }
                        else
                        {
                         ScrollSearch = FindNext(Folder);
                        }
                }
Добавлено через 4 минуты
А вообще лучше использовать стандартную конструкцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 if (FindFirst(cd+"\\*.*", faAnyFile, sr) == 0)
 {
  do
  {
   if ((sr.Name!=".")&&(sr.Name!=".."))
   {
    if ((sr.Attr==16)||(sr.Attr==48))
    {
      // попался вложенный каталог
    }
    else
    {
     // делаем что надо с файлом
    }
  }
  while (FindNext(sr)==0);
 }
1
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
12.05.2011, 23:31  [ТС]
Вау, Чувак ты нереально крут) яж обрдовался когда получилось) СПАСИБО )

Добавлено через 15 часов 44 минуты
как из FindFirst исключить поиск имён папок?

Добавлено через 22 часа 13 минут
Дело в том, что когда в FindFirst указываю директорию по которой, нет файлов, а в реализации их надо найти, то программа зависает. Как сделать проверку, присутствует ли хотя бы один файл по заданной директории или нет, и как сделать, чтоб FindFirst избегала папки, чтоб бы не засорять мне каталог из имен файлов, именами папок!? подскажите решение)

на проверку файла, я думал сойдет код:
C++
1
2
3
4
ScrollSearch = FindFirst(DirectorySt+"\\"+Mask+"*",faDirectory, Folder);
        if(ScrollSearch !=0)
                MessageDlg("Файлов не обнаружено", mtInformation, TMsgDlgButtons() << mbOK,  0) ;
        else "бла бла бла"
но, не получилось
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.05.2011, 07:03
В предыдущем сообщения я приводил стандартную конструкцию, воспользуйтесь ей.
Там как раз
C++
1
if ((sr.Attr==16)||(sr.Attr==48))
отвечает за подкаталоги.
(только вот в семёрке атрибуты могли поменяться, надо проконтролировать все варианты)
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
13.05.2011, 09:26  [ТС]
можно объяснить что означают эти цифры?) в данном случаи
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
13.05.2011, 09:48
16 - это значение атрибута записи TSearchRec, соответствующее faDirectory=0x010

Вообще правильно будет писать
C++
1
if (sr.Attr&faDirectory)
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
13.05.2011, 10:33  [ТС]
я так понимаю, если у нас существует фаил, то выполняется условие, но если его нет. то и
C++
1
ScrollSearch = FindFirst("*.*",faDirectory, Folder);
ничего не найдет и так.

Добавлено через 29 минут
некого рода зависания при поиске, можно так исправил заменив"faDirectory" на "faAnyFile"

Добавлено через 6 минут
хотя, всё равно виснит прога, когда указываю директорию на папку в которой нет файлов. ох блин, да чтож такое.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.05.2011, 12:57
Список всех каталогов-файлов в заданном каталоге
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Для поиска файлов в каталоге и его подкаталогах напишите следующий код:
void ListFiles(AnsiString path, TStrings* List)
{
// Эта процедура выводит список файлов и вызывает
// саму себя для всех каталогов
TSearchRec sr;
if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
{
 do
 {
 if (sr.Attr & faDirectory)
  {
  if (sr.Name!=".")
  if (sr.Name!="..")
   {
   ListFiles(path+sr.Name+"\",List);// Рекурсивный вызов
   }
  }
  else
   {
   AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
   if (Ext==".CPP")
   List->Add(path+sr.Name);
   }
 }
 while (FindNext(sr) == 0);
 FindClose(sr);
}
Application->ProcessMessages();
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListFiles("c:\",Memo1->Lines);
}
// Более короткий вариант:
void __fastcall TForm1::LookInDir(AnsiString DirName)
{
  TSearchRec sr;
  for(int r=FindFirst(DirName+"\\*.*",faDirectory,sr);!r;r=FindNext(sr))
    if((sr.Attr&faDirectory) && (sr.Name!="." && sr.Name!=".."))
      LookInDir(DirName+"\\"+sr.Name);
  FindClose(sr);
  for(int r=FindFirst(DirName+"\\*.bmp",faDirectory,sr);!r;r=FindNext(sr))
    // имя файла: DirName+"\\"+sr.Name - делай с ним что хочешь
  FindClose(sr);
}
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
13.05.2011, 18:12  [ТС]
это же надо иметь, такую силу воли и желния, чтоб написать лист текста незнакомому человеку) благодарю
0
274 / 64 / 4
Регистрация: 18.04.2011
Сообщений: 1,362
Записей в блоге: 1
17.05.2011, 13:14  [ТС]
вернусь к этой теме. написано вами код, зависает, если указать путь к абсолютно пустой папке.
а такое условие не срабатывает.
C++
1
2
3
4
5
6
if( (ScrollSearch = FindFirst(DirectorySt+"\\"+Mask+"*",faDirectory,Folder))==0)
        {блабла}
     else
         {
          MessageDlg("Файлов не обнаружено", mtInformation, TMsgDlgButtons() << mbOK,  0) ;
         }
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
17.05.2011, 18:45
C++
1
"*.*"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2011, 18:45
Помогаю со студенческими работами здесь

Как получить список директорий и список файлов в директории?
Очень нужно организовать поиск на диске. Как искать в нутри файла я знаю, а вот как искать вовсех файлах на диске и в поддиректориях незная

FTP: получение списка файлов из потока. Как вывести список файлов из директории?
доброго времени суток. пытаюсь написать свой FTP-клиент. отправил серверу команду LIST, и в ответ он выдал &quot;ок. успешно&quot; ...

Добавление файлов в список ассоциации файлов
Добавление нужных файлов в список ассоциации файлов

findfirst+findnext
Много лет работал со сладкой парочкой findfirst-findnext и совершенно не подозревал в них такого коварства! Оказывается, несмотря на...

Ошибки .FindFirst
Помогите разобраться. Есть recordset, составленный по записям списка: Dim rst As Recordset Set rst =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru