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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2010, 11:24   #1
tozter
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 16
По умолчанию [Delphi 7] Поиск файлов из консольного приложения.

Надо сделать поиск из консольного приложения. Вот код:
Код:
function FindFile(Dir: string): Boolean;
var
  SR: TSearchRec;
  FindRes,Glub: Integer;
begin
  FindRes := FindFirst(Dir + 'file01', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if ((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..') or (Glub > 3)) then
    begin
      FindRes := FindNext(SR);
      Glub := 0;
      Continue;
    end;

    // если найден каталог, то
    if ((SR.Attr and faDirectory) = faDirectory) then
    begin
      // входим в процедуру поиска с параметрами текущего каталога +
      // каталог, что мы нашли
      FindFile(Dir + SR.Name + '\\');
      FindRes := FindNext(SR);
      // после осмотра вложенного каталога мы продолжаем поиск
      // в этом каталоге
      Glub := Glub +1;
      Continue; // продолжить цикл
    end;
    CopyFile(PChar(SR.Name), PChar(String(GetWindowsDir)+'\temp\'+ copy(Dir,1,1) +'file01'),true) ;
   
    FindRes := FindNext(SR);
  end;
  FindClose(SR);     <---   На эту строчку ругается!
end;
Почему при компиляции ругается на FindClose(SR); ?
tozter вне форума Ответить с цитированием
Старый 15.12.2010, 11:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Какими словами ругается? Или ты действительно думаешь что мы все телепаты тут?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2010, 12:02   #3
tozter
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Какими словами ругается? Или ты действительно думаешь что мы все телепаты тут?

Вот:

[Error] finder.dpr(65): Incompatible types: 'Cardinal' and 'TSearchRec'
tozter вне форума Ответить с цитированием
Старый 15.12.2010, 13:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не знаю.. у меня всё компилируется... (правда, пришлось функцию GetWindowsDir дописать)..
Код:
program finder;
{$APPTYPE CONSOLE}
uses Windows,SysUtils;

function GetWindowsDir : string;
var
  WinIniFileName : array[0..MAX_PATH] of char;
begin
  GetWindowsDirectory(WinIniFileName, sizeof(WinIniFileName));
  Result := WinIniFileName;
end;


function FindFile(Dir: string): Boolean;
var
  SR: TSearchRec;
  FindRes,Glub: Integer;
begin
  FindRes := FindFirst(Dir + 'file01', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if ((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..') or (Glub > 3)) then
    begin
      FindRes := FindNext(SR);
      Glub := 0;
      Continue;
    end;

    // если найден каталог, то
    if ((SR.Attr and faDirectory) = faDirectory) then
    begin
      // входим в процедуру поиска с параметрами текущего каталога +
      // каталог, что мы нашли
      FindFile(Dir + SR.Name + '\\');
      FindRes := FindNext(SR);
      // после осмотра вложенного каталога мы продолжаем поиск
      // в этом каталоге
      Glub := Glub +1;
      Continue; // продолжить цикл
    end;
    CopyFile(PChar(SR.Name), PChar(String(GetWindowsDir)+'\temp\'+ copy(Dir,1,1) +'file01'),true) ;

    FindRes := FindNext(SR);
  end;
  FindClose(SR);     // <---   На эту строчку ругается!
end;

begin
  FindFile('C:\dddaafff');
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2010, 13:48   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

попробуйте так: SysUtils.FindClose(SR);
Может поможет
Одноименная функция есть в unit Windows
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.12.2010 в 13:51.
Аватар вне форума Ответить с цитированием
Старый 15.12.2010, 20:43   #6
tozter
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
попробуйте так: SysUtils.FindClose(SR);
Может поможет
Одноименная функция есть в unit Windows

Да, помогло.
Спасибо.
tozter вне форума Ответить с цитированием
Старый 15.12.2010, 21:00   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
tozter
А все потому что у тебя скорее всего стоит
Код:
uses
  Messages, SysUtils,... Windows,
В то время как надо

Код:
uses 
  Windows,  Messages, SysUtils
т.е. SysUtils должен перекрывать Windows, стоя за ним, или как уже сказали писать полный путь с указанием модуля перед процедурой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2010, 21:20   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet
В то время как надо
Код:
uses 
  Windows,  Messages, SysUtils
т.е. SysUtils должен перекрывать Windows, стоя за ним, или как уже сказали писать полный путь с указанием модуля перед процедурой.
Гениально! 100% попадание!
к свою стыду осознаю, что я не знал о том, что порядок перечисления модулей в uzes имеет значение.
Спасибо за науку!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.12.2010, 23:57   #9
tozter
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 16
По умолчанию

А как сделать так, что б поиск был не глубже 2-го подкаталога?

Последний раз редактировалось tozter; 16.12.2010 в 01:24.
tozter вне форума Ответить с цитированием
Старый 16.12.2010, 08:36   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты счетчик глубины заведи.
Код:
var level:integer;
...
function FindFile(Dir: string): Boolean;
var
  SR: TSearchRec;
  FindRes,Glub: Integer;
begin
  inc(level);
  if level>2 then exit;
  FindRes := FindFirst(Dir + 'file01', faAnyFile, SR);
Цитата:
не знал о том, что порядок перечисления модулей в uzes имеет значение.
Ну логически рассуди - компилятор считал первый модуль, обнаружил в нем функцию, запомнил ее в список по именно. Потом считал второй модуль, обнаружил в нем такую же функцию, с таким же именем. Естественно он запомнит без задней мысли и ее в список, затерев первую запомненую.
В общем есть такой прикол в языках Вирта.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрытие окна консольного приложения padsyukin Общие вопросы Delphi 9 16.12.2010 18:15
Перехват строк из консольного приложения Slonnn Помощь студентам 6 08.04.2010 14:28
Перевод консольного приложения в оконное varvara16 Общие вопросы C/C++ 17 10.09.2009 13:20
Закрытие консольного приложения по ENTER в C++ Сергей089 Помощь студентам 4 02.03.2009 21:17
Перехват вывода консольного приложения Роман Радер Общие вопросы Delphi 0 12.02.2007 18:40