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

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

FindFirst, FindNext, FindClose [D5, Win95/98, Win2k]


BJValentine ©   (2002-11-21 11:25:00) 

Ребята, кто на этом собаку съел. Юзаю, нифига не получается.
Пробую: FindFirst("c:\temp",faAnyFile,Attrs);
, а оно выдаёт Attrs.Name=temp, причём папка temp не пуста.


Dimka Maslov   (2002-11-21 14:56:00) [1]

http://delphibase.endimus.com/?action=viewfunc&topic=fileops&id=10046


Anatoly Podgoretsky   (2002-11-21 13:19:00) [2]

Да если надо твой код довести до кондиции, то не составит проблем, но думаю что BJValentine и так это сделать сам в состоянии


Anatoly Podgoretsky   (2002-11-21 13:18:00) [3]

Не надо для меня или для Song или для Игорь Шевченко - из трех проблем ты исправил только 1. и то оставил определение переменной.

по пункту 3. attr = 0 это довольно подлая и грубая ошибка.

Еще раз не надо приводить код для нас, замечания то сделано совсем с другой целью, только показать где у тебя ошибки и я думаю что BJValentine их просто учтет. А если нужен правильный код то в Чаво приведен отлаженный код, учитывающий и разные версии Дельфи (у тебя правда тоже учтено).


liho26   (2002-11-21 13:13:00) [4]

Ладно, с Begin и end я погорячился....


Song   (2002-11-21 13:07:00) [5]

Тогда во-первых не откпомпилится, а во-вторых даже если откомпилится :-) FindClose() будет вызываться даже если файл(ы) такой(ие) не найден(ы).
Я бы сказал, надо переменной i вообще присвоить 0.
Так что liho26, давай ещё раз!? ;-)


liho26   (2002-11-21 13:02:00) [6]

Ну, вы, блин, мужики даете! :)
Если честно, у меня все нормально работает. Впрочем, для самых настырных настоятельно рекомендую
1. убрать две строки после

if FindFirst(SearchString, 0, res)=0 then

Соответсвенно это

begin
data.Add(res.Name);

Убрать end;после FindClose(res);

Или
2. ничего не трогать и только в цикле
For i:=1 to Data.Count-1 do
переменной i присвоить значение 2.

Все, с меня хватит! Я только дал подсказку и не слова не говорил о том, что это готвый вариант. Как и что подправить в коде, чтобы он работал в вашем конкретном случае корректно - думайте сами! )))
-------------------
С уважением...


Song   (2002-11-21 12:51:00) [7]

А теперь ещё раз для меня т.к. опять два раза добавляется :)


liho26   (2002-11-21 12:47:00) [8]

Извиняюсь, ошибочка вышла. "Без ног" получилась она. Вот верный код

procedure TForm1.FindFile;
Var
res: TsearchRec;
i: Integer;
SearchString: String;
data: TstringList;

begin
Memo1.Clear;
SearchString:="C:\Temp\*.jpg";

Data:=TStringList.Create;
try
if FindFirst(SearchString, 0, res)=0 then
begin
data.Add(res.Name);
repeat
data.Add(res.Name);
until FindNext(res) <> 0;
FindClose(res);
end;

// Отдаем все в Memo
For i:=1 to Data.Count-1 do
Memo1.Lines.Add(Data.Strings[i]);
finally
Data.Free;
end;
end;


Игорь Шевченко   (2002-11-21 12:46:00) [9]

Блин, но все равно два раза первое имя добавляется :-)
Придется еще и для меня переписать :-)


liho26   (2002-11-21 12:45:00) [10]

Анатолий, эта процедура переписана специально для Вас! ))

procedure TForm1.FindFile;
Var
res: TsearchRec;
i: Integer;
SearchString: String;
data: TstringList;

begin
Memo1.Clear;
SearchString:="C:\Temp\*.jpg";

Data:=TStringList.Create;
try
if FindFirst(SearchString, 0, res)=0 then
begin
data.Add(res.Name);
repeat
data.Add(res.Name);
until FindNext(res) <> 0;
FindClose(res);
end;

--------------------
С уважением....


Song   (2002-11-21 12:42:00) [11]

Народ, я ссылку дал, вам лень сходить?


Anatoly Podgoretsky   (2002-11-21 12:26:00) [12]

Только три ошибки

1. неопределен I, точнее данная переменная вообще не нужна, memo1.Lines.Add()
2. первое имя добавляется дважды
3. attr := faAnyFile; по вопросу все файлы, но может надо - faDirectory, а еще точнее данная переменная вообще не нужна, заменить константой.

Остальное нормально


liho26   (2002-11-21 12:14:00) [13]

Ок. Вот работая версия программы: Полный вариант. Нужны Memo and SpeedButton. В каталоге С:\temp ищем все файлы с расширением jpg


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Memo1: TMemo;
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
private
procedure FindFile;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FindFile;
Var
res: TsearchRec;
attr, i: Integer;
SearchString: String;

begin
attr:=0;
i:=0;

SearchString:="C:\Temp\*.jpg";
if FindFirst(SearchString, attr, res)=0 then
begin
memo1.Lines.Insert(0,res.Name);
repeat
memo1.Lines.Insert(i,res.Name);
i:=i+1;
until FindNext(res) <> 0;
FindClose(res);
end;
end;


procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
FindFile;
end;
end.


Reindeer Moss Eater   (2002-11-21 11:48:00) [14]

Пробую: FindFirst("c:\temp",faAnyFile,Attrs);
Пробуй: FindFirst("c:\temp\*.*",faAnyFile,Attrs);


Anatoly Podgoretsky   (2002-11-21 11:44:00) [15]

Только не рабочая, но возможно потому что не все приведено и кроме того не соответствует ешл вопросу, attr не верный.


liho26   (2002-11-21 11:35:00) [16]

Вот процедурка из моей программки. Может поможет?


Var
res: TsearchRec;
attr: Integer;
SearchString: String;
a: TstringList;

begin
attr:=0;
if FindFirst(SearchString, attr, res)=0 then
begin
a.Insert(0,res.Name);
repeat
a.Insert(i,res.Name);
i:=i+1;
until FindNext(res) <> 0;
FindClose(res);
end;

Вместо SearchStringпоставь свой путь к папочке


Song   (2002-11-21 11:26:00) [17]

http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=delphi;action=display;num=1037272197


Наверх

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