Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск файлов. [D7, XP]


Страницы:   1 2

Tek Noise ©   (2005-11-06 14:32:00) 

Здравствуйте! Нашёл на просторах форума код.
Он не работает, выдвёт ошибку "Runtime error 216 at 00403DF8".
Мне собственно нужно, что бы программа искала заданную дирректорию(можно и фаил), и результат записывала в фаил. с записью проблем нету, а вот с поиском, и записью данных в переменную... Подскажите, что в нижеприведенном коде исправить. Спасибо!

program flist;

{$APPTYPE CONSOLE}

uses
Windows;

procedure Output(const FileName : String);
var
p : PChar;
begin
p := PChar(FileName);
CharToOEM(p, p);
WriteLn(p);
end;

procedure AddTrailingBackslash(var Str : String);
begin
if not (Str[length(Str)] in ['/', '\']) then Str := Str + '\';
end;

procedure DoSearch(Directory : String; const SearchSubdirectories : Boolean);
var
fd : TWin32FindData;
h : Cardinal;
begin
AddTrailingBackslash(Directory);

Output('Поиск по директории: ' + Directory);
h := FindFirstFile(PChar(Directory + '*'), fd);
if (h <> INVALID_HANDLE_VALUE) then begin
 repeat
  if (fd.cFileName[0] <> '.') and (fd.cFileName <> '..') then
   if ((fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) then begin
    DoSearch(Directory + fd.cFileName, SearchSubdirectories);
   end else
    Output(fd.cFileName);
 until (FindNextFile(h, fd) = FALSE);
end;
end;

begin
DoSearch(ParamStr(1), true);
ReadLn;
end.


sniknik   (2005-11-06 19:56:00) [21]

> (код мой :)
больше похоже на переделку чужого...
т.к.
параметр SearchSubdirectories в этой реализации смысла не имеет... (в оригинале видать был, но вырезан)
в условии  if (fd.cFileName[0] <> '.') and (fd.cFileName <> '..') then
у двух сравнений совершенна различна логика, т.е. если ты понимал зачем делаеш так как первом то зачем второе? (если переделывалось то понятно, непонял одно добавил другое лишнее, или наоборот понял,  переделал как лучше, но старое убрать забыл)

тоже переделал, надеюсь чуть лучше.
{$APPTYPE CONSOLE}

uses
 Windows;

function ToOem(const Str: String): String;
begin
 SetLength(result, Length(Str));
 CharToOem(PChar(Str), PChar(result));
end;

function AddBackslash(const Str: String): String;
begin
 if not (Str[length(Str)] in ['/', '\']) then result:= Str + '\'
                                         else result:= Str;
end;

procedure DoSearch(const Directory: String; const SearchSub: Boolean);
var
 fd: TWin32FindData;
 h: THandle;
begin
 Writeln(ToOem('Поиск по директории: ' + Directory));

 h:= FindFirstFile(PChar(Directory + '*'), fd);
 if (h <> INVALID_HANDLE_VALUE) then
 begin
   with fd do
     repeat
       if (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
       begin
         if cFileName[0] = '.' then Continue;
         if SearchSub then DoSearch(AddBackslash(Directory+cFileName), SearchSub);
       end else
         Writeln(ToOem(cFileName));
     until FindNextFile(h, fd) = FALSE;
   FindClose(h);
 end;
end;

begin
 if ParamCount > 0 then DoSearch(AddBackslash(ParamStr(1)), ParamCount >= 2);
 Readln;
end.


> как он рабатет в 2х словах
уложусь в одно - рекурсия.
хочеш подробностей ищи по этому слову.

> как параметр задавать?
в командной строке
flist.exe параметр параметр
первый параметр это диск/директория второй неважно что, просто по его присутствию сканируются подкаталоги.
т.е. так
flist.exe D:\
только файлы в корне диска D:\
а так
flist.exe D:\ скан
с файлы с вложенными каталогами.


Tek Noise   (2005-11-06 17:53:00) [22]

Набережных С. ©   (06.11.05 16:13) [3]
Спасибо, теперь хотя бы невыводит ошибок %)

Zeqfreed ©   (06.11.05 17:46) [4]
Спасибо вам огромное за код! Немогли бы вы рассказать, как он рабатет в 2х словах =/ как параметр задавать?


Zeqfreed   (2005-11-06 17:46:00) [23]

Набережных С. ©   (06.11.05 16:13) [3]
Эх, всегда тороплюсь и что-нибудь забываю :(
(код мой :)


Набережных С.   (2005-11-06 16:13:00) [24]

А, вот еще что:

begin
if ParamCount > 0 then DoSearch(ParamStr(1), true);
ReadLn;
end.


Но без параметра запускать бессмысленно, хотя эта проверка, конечно, должна быть.
Да, и надо бы после
until (FindNextFile(h, fd) = FALSE);
вызывать Windows.FindClose


Tek Noise   (2005-11-06 15:34:00) [25]

Набережных С. ©   (06.11.05 15:14) [1]

Спасибо за ответ, но всё равно программа не запускаеться, вылетает ошибка =/


Набережных С.   (2005-11-06 15:14:00) [26]

procedure Output(const Data: String);
var
 Tmp: string;
begin
 SetLength(Tmp, Length(Data));
 CharToOEM(PChar(Data), PChar(Tmp));
 WriteLn(Tmp);
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо