Воскресенье, 22.12.2024, 11:46 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: xXxSh@dowxXx, Anton93, Волк-1024  
Рекурсивный поиск файлов на API
Волк-1024Дата: Вторник, 17.01.2012, 19:35 | Сообщение # 1
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Здравствуйте всем. Снова я. И снова проблемы из-за не великих познаниях в апи. На этот раз с поиском файлов в папках и подпапках.

Дело в том, что я перепиливаю на апи вот эту функцию.

Code
procedure GetAllFiles(mask: string);
var
   search: TSearchRec;
   directory: string;
begin
   directory := ExtractFilePath(mask);

   if FindFirst(mask, $23, search) = 0 then
   begin
     repeat
       Form1.ListBox1.Items.Add(directory + search.Name);

     until FindNext(search) <> 0;
   end;

   if FindFirst(directory + '*.*', faDirectory, search) = 0 then
   begin
     repeat
       if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then
         GetAllFiles(directory + search.Name + '\' + ExtractFileName(mask));
     until FindNext(search) <> 0;
     FindClose(search);
   end;  
end;


Получилось что-то вроде того:

Code
function ScanFile(Dir, Mask: string; var Buff: array of string): integer;
var

    hF: DWORD;
    C: integer;
    FData: _WIN32_FIND_DATA;

begin
     C:=0;
     hF:=FindFirstFile(PAnsiChar(Dir+Mask), FData);
     if hF<>INVALID_HANDLE_VALUE then
     begin
         while (FindNextFile(hF, FData)) do
         begin
           Buff[C-1]:=(Dir+(FData.cFileName));
           C:=C+1;
     end;
     Windows.FindClose(hF);
  end;
     hF:=FindFirstFile(PChar(Dir), FData);
     if hF<>INVALID_HANDLE_VALUE then
     begin
        repeat
           if ((FData.dwFileAttributes and fadirectory)=fadirectory) and (FData.cFileName[1]<>'.') then
           ScanFile(Dir+FData.cFileName+'\'+(ExtractFileName(Dir)), Mask, Buff);
        until (FindNextFile(hF, FData)=true);
        Windows.FindClose(hF);
        end;
        Result:=C;
end;


Суть функции: она должна найти всё файлы в подпапках и записать их в массив. В результате функция должна вернуть количество найденных файлов. (Тут это криво реализовано - подсчет каждой найденного файла. Лучше в конце подсчитать количество элементов в массиве).

Проблема в том, что верхняя функция (не перепилиная) работает как надо, а моя заносит в массив лишь те файлы, которые хранятся в папках, откуда был начат поиск. Видимо я что-то не правильно переписал...

Помогите, пожалуйста, допилить эту функцию до полностью рабочего состояния...


Pascal, C\C++, Assembler, Python
 
Волк-1024Дата: Пятница, 20.01.2012, 19:47 | Сообщение # 2
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Если что, проблема решена.

Pascal, C\C++, Assembler, Python
 
gravitasДата: Пятница, 20.01.2012, 20:03 | Сообщение # 3
Авторитетный
Зарегистрирован: 01.05.2010
Группа: Пользователи
Сообщений: 385
Статус: Offline
Quote (Волк-1024)
Если что, проблема решена.

Решил проблему - запости решение!


TheDeduction

Для ускорения получения ответов на ваши вопросы рекомендуется подкармливание в виде +'ов в рейтинг :)
 
Волк-1024Дата: Пятница, 20.01.2012, 22:35 | Сообщение # 4
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 469
Статус: Offline
Я просто не стал переписывать код. Оказалось первый (рабочий вариант) не сильно повлиял на размер проги (консольная). Что для меня было очень важно. Если перепишу, то выложу.

Pascal, C\C++, Assembler, Python

Сообщение отредактировал Волк-1024 - Пятница, 20.01.2012, 22:35
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz