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

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

Что я делаю не так?


Страницы:   1 2

Bad_B ©   (2007-08-25 22:53:00) 

Задача самая простая: поиск в папке файла размер которого меньше (к примеру) 1,5 кб и дописать в него инфу из мемо,
если же такого файла не найдено, то создать и записать.

Вот что сделал, не могу понять почему работает не верно (создает кучу пустых файлов).
var
i,h:integer;
f:Tsearchrec;
put:string;
hhh:textfile;

begin
randomize;
//задаем путь где искать и что искать
if FindFirst(extractfiledir(expandfilename('ads.s3m'))+'\*.htm',faAnyFile,f)=0 then
repeat
//имя и размер файла записываем в стринг грид
form1.sg1.Cells[0,form1.sg1.RowCount-1]:=f.Name;
form1.sg1.Cells[1,form1.sg1.RowCount-1]:=inttostr(f.size);
//если размер меньше 1,5 кб, то дописываем в него инфу из мемо
if f.size<=1500 then
begin
assignfile(hhh,extractfiledir(expandfilename('ads.s3m'))+'\'+f.Name);
//что б пользователь видел в какой файл дописывается
label2.Caption:=extractfiledir(expandfilename('ads.s3m'))+'\'+f.Name;
Append(hhh);
writeln(hhh,s1,memo1.text,s2);
closefile(hhh);
break;//после записи прерываем поиск
end
//если не найдено такого файла, то создаем пустой файл
else
begin
h:=random(231);
filecreate(extractfiledir(expandfilename('ads.s3m'))+'\'+inttostr(h)+'.htm');
end;
until FindNext(f)<>0;
FindClose(f);
end;


Bad_B   (2007-08-26 16:30:00) [21]

Сорри за навязчивсть, но надо таки разобраться до конца, что б не задавать таких вопросов.

> Loginov Dmitry ©   (26.08.07 09:31) [11]


h:=random(23);
put:='D:\web\raz\dot\'+inttostr(h)+'.htm';
filecreate(put);
fileclose(filecreate(put));

все равно не закрывает, или я не так делаю?


> Anatoly Podgoretsky ©   (26.08.07 12:50) [12]

Непременно воспользуюсь советом, но extractfiledir(expandfilename('ads.s3m'))+'\*.htm'тоже дает верный результат. где не верно-то?

ЗЫ. не бейте ногами, как могу пытаюсь разобраться


Anatoly Podgoretsky   (2007-08-26 12:50:00) [22]

const
  RootPath = 'D:\web\raz\dot\'

И используешь везде, а не дурдом под названием expand, работу которого ты не понимаешь.
Можешь и явно указывать в каждом месте, но это не удобно, особенно если его надо сменить при разработке.


Loginov Dmitry   (2007-08-26 09:31:00) [23]

filecreate после создания файла держит его открытым. Для закрытия нужно использовать CloseHandle.


> имхо, подоплека была в другом... "не смешивай функции работающие
> с файловыми переменными (write,assignfile) c функциями,
> работающими с дескрипторами (filecreate)..." видимо отсюда
> error#103


скорее ошибка он неполного понимания того, что делаешь.


Bad_B   (2007-08-26 04:43:00) [24]


> Германн ©   (26.08.07 02:41) [9]

имхо, подоплека была в другом... "не смешивай функции работающие с файловыми переменными (write,assignfile) c функциями, работающими с дескрипторами (filecreate)..." видимо отсюда error#103


Германн   (2007-08-26 02:41:00) [25]


> Bad_B   (26.08.07 02:31) [8]
>
>
> > Германн ©   (26.08.07 01:57) [7]
>
> сейчас попробую еще разок подробно описать что и как (может
> и сам соображу)
>
> В общем по такому пути "D:\web\raz\dot\" находятся различные
> htm файлы

Вот по такому пути и ищи!


> Я это делаю так
> (чуток переписал код от первонального):
>
> procedure tform1.proverka;
> var
> h,k,uuu:integer;
> f:Tsearchrec;
> begin
> uuu:=0;
> if FindFirst('*.htm',faAnyFile,f)=0 then

А тут ты ищещь по пути заданному в CurrentDir :(


> filecreate(extractfiledir(expandfilename(f.Name))+'\'+inttostr(h)+'.
> htm');

А тут ты опять уходишь незнамо куда.
Короче, прочитай хэлп по "expandfilename" и "CurrentDir". Внимательно. Будут вопросы, милости просим.


Bad_B   (2007-08-26 02:31:00) [26]


> Германн ©   (26.08.07 01:57) [7]

сейчас попробую еще разок подробно описать что и как (может и сам соображу)

В общем по такому пути "D:\web\raz\dot\"находятся различные htm файлы и файлы других форматов. Мне надо найти все htm, удовлетворяющие условию(д.б. меньше 1,5 кб). Я это делаю так
(чуток переписал код от первонального):

procedure tform1.proverka;
var
h,k,uuu:integer;
f:Tsearchrec;
begin
uuu:=0;
if FindFirst('*.htm',faAnyFile,f)=0 then
repeat
//if f.size<=1500 then
begin
form1.sg1.Cells[0,form1.sg1.RowCount-1]:=ExpandFileName(f.name);
form1.sg1.Cells[1,form1.sg1.RowCount-1]:=inttostr(f.size);
memo1.Lines.Add(ExpandFileName(f.name));
sg1.RowCount:=sg1.RowCount+1;
end;
until FindNext(f)<>0;
FindClose(f);


Затем я определяю какие файлы нужны (файлы менее 1,5 кб) через такую вот одновременную проверку:

//проверил размер, если меньше значит удовлетворяет и в соседней ячейке грида пишу тру, иначе ложь
for k:=1 to sg1.RowCount-1 do
if strtoint(sg1.Cells[1,k])<1500 then
sg1.Cells[2,k]:='True'
else
sg1.Cells[2,k]:='False';
//считаю сколько набралось тру
for k:=1 to sg1.RowCount-1 do
if sg1.Cells[2,k]='True' then
inc(uuu);
//если нет ни одного тру, то создаю файл
if uuu=0 then
begin
h:=random(231);
filecreate(extractfiledir(expandfilename(f.Name))+'\'+inttostr(h)+'.htm');
end;end;


Записываю в файл удовлетворяющий условию так:
procedure tform1.Zapis;
var
k:integer;
hhh:textfile;
begin
proverka;
for k:=1 to sg1.RowCount-1 do
if (strtoint(sg1.Cells[1,k])<=1500)  then
begin
assignfile(hhh,sg1.Cells[0,k]);
Append(hhh);
writeln(hhh,s1,memo1.text,s2);
closefile(hhh);
end;
end;


По нажатию на кнопку вызываю zapis.
Все вроде как даже работает, и записывается в файл, и после его "наполнения" создается, да только на этом все и заканчивается, после создания файла уже 103 ошибка (не вожможно открыть файл) выбивает...

ЗЫ. знаю что проблема простейшая, но в упор не вижу(((


Германн   (2007-08-26 01:57:00) [27]


> Bad_B   (26.08.07 01:18) [6]
>
>
> > Германн ©   (26.08.07 01:08) [5]
>
> так подскажите как сделать не бред?
>

Подскажу, если объяснишь "где ты хочешь искать"?


Bad_B   (2007-08-26 01:18:00) [28]


> Германн ©   (26.08.07 01:08) [5]

так подскажите как сделать не бред?

ЗЫ. на примитиве завис...


Германн   (2007-08-26 01:08:00) [29]


> Bad_B   (25.08.07 22:53)

...

> //задаем путь где искать и что искать
> if FindFirst(extractfiledir(expandfilename('ads.s3m'))+'\*.
> htm',faAnyFile,f)=0 then
>

"Что искать" тут задано. А вот "Где искать" - тут полный бред.


Anatoly Podgoretsky   (2007-08-25 23:28:00) [30]

Инвариант extractfiledir(expandfilename('ads.s3m')) можно и нужно вынести за пределы цикла


Anatoly Podgoretsky   (2007-08-25 23:24:00) [31]

> Bad_B  (25.08.2007 23:18:02)  [2]

То есть ты это и хотел и тебя не смущает, что этот путь может быть разным?
Зависит от погоды на марсе.


Bad_B   (2007-08-25 23:18:00) [32]


> Anatoly Podgoretsky ©   (25.08.07 22:58) [1]

ShowMessage(extractfiledir(expandfilename('ads.s3m')))  показывает "D:\web\raz\dot", а мне нужно "D:\web\raz\dot\*.htm"
поэтому я ж и написал в коде
extractfiledir(expandfilename('ads.s3m'))+ '\*.htm'

или я что не понял?


Anatoly Podgoretsky   (2007-08-25 22:58:00) [33]

> Bad_B  (25.08.2007 22:53:00)  [0]

ShowMessage(extractfiledir(expandfilename('ads.s3m')));


Страницы:   1 2

Наверх

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