Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посик файлов, WinAPI 
:(
    Опции темы
Rondo
Дата 17.1.2007, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Нашел такую процедуру, которая ищет в каталоге и подкаталогах нужные мне файлы
Код

procedure ScanDir(Dir: string);
var
  SearchRec: TSearchRec;
begin
  if Dir<>'' then
    if Dir[length(Dir)]<>'\' then
      Dir:=Dir+'\';
    if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
      repeat
        if (SearchRec.name='.') or (SearchRec.name='..') then
          continue;
        if (SearchRec.Attr and faDirectory)<>0 then
          ScanDir(Dir+SearchRec.name)
        else begin
          if Pos('.ini', SearchRec.Name) <> 0 then
            IniPath := IniPath + Dir + SearchRec.Name + #13#10;
        end;
      until FindNext(SearchRec)<>0;
  FindClose(SearchRec);
end;


Работает как надо, только требует модуль SysUtils - лишний размер. Но мне этот модуль включать нельзя, сильно растет размер .exe файла .. Кто нибуть подкиньте аналог этой процедуры не использующая модуля SysUtils - размер критичен! Или можно чтонибудь подобное сделать в KOL? 

Это сообщение отредактировал(а) Rondo - 17.1.2007, 06:42
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
DoZENT
Дата 17.1.2007, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 2.6.2006

Репутация: 1
Всего: 1



Пример из MSDN правда без рекурсии
Код

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   char DirSpec[MAX_PATH];  // directory specification
   DWORD dwError;

   printf ("Target directory is %s.\n", argv[1]);
   strncpy (DirSpec, argv[1], strlen(argv[1])+1);
   strncat (DirSpec, "\\*", 3);

   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("Invalid file handle. Error is %u\n", GetLastError());
      return (-1);
   } 
   else 
   {
      printf ("First file name is %s\n", FindFileData.cFileName);
      while (FindNextFile(hFind, &FindFileData) != 0) 
      {
         printf ("Next file name is %s\n", FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES) 
      {
         printf ("FindNextFile error. Error is %u\n", dwError);
         return (-1);
      }
   }
   return (0);
}



--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
Rondo
Дата 17.1.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



В С++ ваще ниче не понимаю smile
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Snowy
Дата 17.1.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



PM MAIL   Вверх
Alexeis
Дата 17.1.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Код

procedure ScanDir(Dir: string);
var
  Find      : TWin32FindData;
  hFind     : THANDLE;

begin
  if Dir<>''
  then
    if Dir[length(Dir)]<>'\'
    then
      Dir:=Dir+'\';

  Dir := Dir + '*.*';
  hFind := windows.FindFirstFile(PChar(Dir), Find);
  if (hFind <> INVALID_HANDLE_VALUE)
  then
  Begin
    Repeat
      if ((Find.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and
         ((AnsiString(Find.cFileName) = '.') or (AnsiString(Find.cFileName) = '..'))
      then
        ScanDir(Dir+SearchRec.name)
      else
        //тут всякая обработка
        ;

    until not windows.FindNextFile(hFind, Find);

    windows.FindClose(hFind);
  end;


Это сообщение отредактировал(а) Alexeis - 17.1.2007, 13:06


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 17.1.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



"windows." можно не добавлять, т.к. SysUtils всё равно не подключен.
PM MAIL   Вверх
Alexeis
Дата 17.1.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Snowy, уточнение никогда не вредно, кто знает, может в последствии кто-нибудь захочет использовать этот код вместе с VCL, а так получается что-то вроде универсального шаблончика. 
   ИМХО если не лень, то такие уточнения всегда на только пользу.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rondo
Дата 17.1.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Alexeis, Спасибо за код smile Только он выдает содержимое текущего каталога, мне еще нужно получить все что лежит в подкаталогах smile
И в 22 строке ошибка. Неизвестная переменная SearchRec.Name, заменил его этим Find.cFileName, но показывает только текущий каталог  smile 

Это сообщение отредактировал(а) Rondo - 18.1.2007, 06:00
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Rondo
Дата 18.1.2007, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Тема еще актуальна, поиск не дает результатов  smile 

Вот нашел код, использующий KOL

Код

program Primer12;

uses
  Windows,
  Messages,
  Kol;

  {$APPTYPE CONSOLE}
var
  Form: Pcontrol;
  // ----- элементы интерфейса -----
  List: PControl;
  // -----------------------------
  FindHandle : THandle;
  FindData : TWin32FindData;
  b: boolean;
  s: string;
begin
  Applet := NewApplet( 'Список файлов' );
  form:=NewForm(Applet, 'Список файлов' ).SetSize(300, 400);
  form.CenterOnParent;
  List := NewListBox(form, []).SetAlign(caClient);

  // устанавливаем атрибуты файла 
  FindData.dwFileAttributes := FILE_ATTRIBUTE_NORMAL;
  // ищем первый файл в каталоге C:\
  FindHandle := FindFirstFile('C:\Program Files\*.*', FindData);
  // если все Ok, тогда продолжаем
  if FindHandle <> INVALID_HANDLE_VALUE then
  begin
     b := true;
     while b do
     begin
       s := FindData.cFileName;
       // всякие точки и двоеточия нам не нужны
       if (s<>'..') and (s<>'.') then
         List.Add(s);
       b := FindNextFile(FindHandle, FindData);
     end;
  end;
  FindClose(FindHandle);

  run(Applet);
end.


Тоже ищет только то что лежит в текущем каталоге, в данном случае выдает только папку Program Files  smile 

Это сообщение отредактировал(а) Rondo - 18.1.2007, 06:13
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Rondo
Дата 18.1.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Код показывает только содержимое текущего каталога.
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
Yanis
Дата 18.1.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Вот, что в конце концов должно было получиться у тебя:
Код
procedure ScanDir(Dir: string; var sFiles: string);
var
  fnd: TWin32FindData;
  hFnd: DWORD;
begin
  if Dir <> '' then
    if Dir[length(Dir)] <> '\' then Dir := Dir + '\';

  hFnd := FindFirstFile(PChar(Dir + '*.*'), fnd);
  if hFnd <> INVALID_HANDLE_VALUE then
    repeat
      if (fnd.cFileName[0] = '.') or (AnsiString(fnd.cFileName) = '..') then
        Continue;

      if Boolean((fnd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)) then
        ScanDir(Dir + fnd.cFileName, sFiles)
      else
        sFiles := sFiles + fnd.cFileName + #13#10;

    until not FindNextFile(hFnd, fnd);

  sFiles := Copy(sFiles, 1, Length(sFiles) - 2);
  Windows.FindClose(hFnd);
end;


Использование:
Код
var
  sf: string;
begin
  sf := '';
  ScanDir('C:\TEMP', sf);
  ShowMessage(sf);
end;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rondo
Дата 19.1.2007, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 24.2.2006
Где: там..

Репутация: нет
Всего: нет



Yanis, Респект smile Все отлично работает!
--------------------
Начинающий кодер  
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.