![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов. [D7, XP]
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;