![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что я делаю не так?
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-27 02:53:00) [1]Опираясь на tmp (26.08.07 22:31) [28]вот что получил:
procedure GetFilesInDirectory(Directory: String; const Mask: String;
List: TStrings;
WithSubDirs, ClearList: Boolean;text:string);
procedure ScanDir(const Directory: String);
var
SR: TSearchRec;
FileHandle:integer;
//это для создания нового файла
procedure Checker(NewFile:string);
begin
if sr.Size>= 1500 then
begin
FileHandle:=filecreate(Directory+inttostr(random(3))+'.htm');
FileClose(FileHandle);
ScanDir(Directory);
end;
end;
//для добавления текста
procedure EdText(fileName:string);
var
hhh:textfile;
begin
filename:=directory+sr.name;
assignfile(hhh,filename);
append(hhh);
writeln(hhh,text);
closefile(hhh);
exit;
end;
begin
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then
try
repeat
// добавил условие if SR.Size<=1500 then
begin
List.Add(Directory + SR.Name);
edtext(Directory + SR.Name);
exit;
end;
until FindNext(SR) <> 0;
finally
begin
FindClose(SR);
checker(Directory);
end;
end;
//проверка в подкаталогах в принципе не нужна, но пока убирать не буду
if WithSubDirs then begin
if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
repeat
if ((SR.attr and faDirectory) = faDirectory) and
(SR.Name <> '.') and (SR.Name <> '..') and (SR.Size<=1500) then
begin
ScanDir(Directory + SR.Name + '\');
end;
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
end;
begin
List.BeginUpdate;
try
if ClearList then
List.Clear;
if Directory = '' then Exit;
if Directory[Length(Directory)] <> '\' then
Directory := Directory + '\';
ScanDir(Directory);
finally
List.EndUpdate;
end;
end;
вызываю так
GetFilesInDirectory(edit1.Text,'*.htm',memo1.Lines,false,true,memo2.Text);
в edit1.Text пишу путь к файлам, потом задаю маску ('*.htm'), в мемо1 выводим полный путь к файлу, проверка в подкаталогах не нужна пока, поэтому false, list очищаем каждый(имхо, полезно для логов поставить false), и мемо2.техт - текст который будет записываться в файл. Целесообразно будет сделать уникальное имя для создаваемого файла, в противном случае (при рандом(3), например) он перезаписывается.
А сейчас что скажете? Что еще исправить, подправить?
tmp (2007-08-26 23:46:00) [2]
> Bad_B (26.08.07 23:38) [30]
> чем код-то ужасен? не надо свой код писать, просто прокомментируйте
> мой, что правильно, что нет.
А что комментировать? Если "ужас! все переписать"...
Вобще алгоритм не хороший. Это я так думаю - может по твоему и нормально.
Anatoly Podgoretsky (2007-08-26 23:41:00) [3]> Bad_B (26.08.2007 23:38:30) [30]
То что переписываешь видно, но также видно что к советам не прислушиваешься, только частично.
Bad_B (2007-08-26 23:38:00) [4]
> tmp (26.08.07 22:31) [28]
спс, сейчас посмотрю
> sniknik © (26.08.07 23:25) [29]
ну, так я ж и не прошу-то код))... до попрошайничал - а терь и с этими "двумя пальцами", как видно, проблема...
я написал код - Вы сами сказали - "ужас! все переписать"...
я за два дня три раза переписываю... но постоянно где-то что-то не то...
чем код-то ужасен? не надо свой код писать, просто прокомментируйте мой, что правильно, что нет.
ЗЫ. ...надо в этом основательно разобраться, раз и навсегда!...
sniknik (2007-08-26 23:25:00) [5]> Такая уверенность, потому что заранее создается на машине.
и юзеры тоже создаются? или им мозги промываются под "стандарт", и запускать программу они будут только так а не иначе, и ярлычков делать не будут/сделают как вам надо.
не понимаю, зачем спрашивал тогда? вам с самого начала твердят о бредовости кода
(а если именно и нужен, текущий, то почему явной функцией его не прочитать? зачем усложнение с запутыванием кода?)
> Если не затруднит (понимаю, если лень или просто нет времени) покажите как надо?
э нет... хоть мне сегодня и нечем заняться, но...
мы же обсуждаем
> Что я делаю не так?
а не "как сделать?/напишите за меня"
и потом для тебя же это просто
> ЗЫ. знаю что проблема простейшая, но в упор не вижу(((
типа как два пальца... так вперед!
так что батенька ты пишешь, а мы говорим что не так. и никак иначе.
tmp (2007-08-26 22:31:00) [6]
> Bad_B (26.08.07 20:31) [24]
Ужасный код.
Вот стандартный пример поиска файлов. Разберись хорошо с этим примером и, если всё правильно поймёшь, то сможешь правильно реализовать свою идею.
Процедура находит файлы определённые маской - Maskв заданном каталоге - Directoryи, возможно, в подкаталогах(в зависимости от WithSubDirs) и добавляет их в List.
procedure GetFilesInDirectory(Directory: String; const Mask: String;
List: TStrings;
WithSubDirs, ClearList: Boolean);
procedure ScanDir(const Directory: String);
var
SR: TSearchRec;
begin
if FindFirst(Directory + Mask, faAnyFile and not faDirectory, SR) = 0 then try
repeat
List.Add(Directory + SR.Name)
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
if WithSubDirs then begin
if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
repeat
if ((SR.attr and faDirectory) = faDirectory) and
(SR.Name <> '.') and (SR.Name <> '..') then
ScanDir(Directory + SR.Name + '\');
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
end;
begin
List.BeginUpdate;
try
if ClearList then
List.Clear;
if Directory = '' then Exit;
if Directory[Length(Directory)] <> '\' then
Directory := Directory + '\';
ScanDir(Directory);
finally
List.EndUpdate;
end;
end;
@!!ex (2007-08-26 21:38:00) [7]оффтоп
> обычно ставят имхо когда так говорят, или я не правильно
> прокомментировал свой код? да, не отрицаю, что пользовался
> советами, но ведь не строчки кода мне запостили (ну, не
> считая const RootPath 'D:\web\raz\dot\'), писал самостоятельно...
> хотя, думайте что хотите, это ваше право...
Вообще то ИМХо в его комментах присутствует.
Лично для меня слова "видимо" и ИМХО, практически синонимы, а для вас?
Bad_B (2007-08-26 21:13:00) [8]//оффтопный пост
> условие совпало, но так будет не всегда.
почему не всегда? если 100% есть уверенность что такой путь существует и совпадает с текущим. Такая уверенность, потому что заранее создается на машине.
> ты надергал откудато (вероятно из ответов тебе) куски разного
> по стилям
обычно ставят имхокогда так говорят, или я не правильно прокомментировал свой код? да, не отрицаю, что пользовался советами, но ведь не строчки кода мне запостили (ну, не считая const RootPath 'D:\web\raz\dot\'), писал самостоятельно... хотя, думайте что хотите, это ваше право...
Если не затруднит (понимаю, если лень или просто нет времени) покажите как надо?
sniknik (2007-08-26 20:51:00) [9]> получается что влияет.
получается ты не слушаешь ответов, зачем спрашиваешь тогда?
> Ведь взависимости от того какой файл (имя) найдет FindFirst в тот файл и записываются данные.
условие совпало, но так будет не всегда.
> Такой путь (т.е. условие о которым вы говорите) существует всегда.
не перевирай, я говорил не об условии существования пути, а об условии совпадения его с текущим.
> Так хоть немного понятнее стало, что я хочу сделать, что сделал и как?
а то. понятно, что ты надергал откудато (вероятно из ответов тебе) куски разного по стилям кода даже не особо понимая что он делает. и до сих пор отказываясь понимать.
> И все ли правильно сделал?
шутишь? при указанных явных ошибках, др. "мелочах" (1,5кб это не 1500б например), и таком неряшливом коде? надо переписывать. однозначно.
Bad_B (2007-08-26 20:31:00) [10]
> sniknik © (26.08.07 20:05) [23]
> параметр из FindFirst както влияет на ExpandFileName
получается что влияет. Ведь взависимости от того какой файл (имя) найдет FindFirst в тот файл и записываются данные.
> все. неправильно.
нет, конечно надо первоначально учитывать а существует ли подобный путь на машине, иначе будут ошибки. Такой путь (т.е. условие о которым вы говорите) существует всегда.
> либо доозвучить
procedure TForm1.Button1Click(Sender: TObject);
var
FileHandle,uuu:integer;
put:string;
hhh:textfile;
f:Tsearchrec;
begin
//для генерации всегда случайных чисел используем, хотя целесообразно перенести в FormCreate, но пока этого не делаю,
randomize;
uuu:=0;
//ищем файлы в папке "D:\web\razl\dot\" все файлы *.htm
if FindFirst('D:\web\razl\dot\*.htm',faAnyFile,f)=0 then
repeat
//если размер файла менее или равен 1,5кб, то
if f.size<=1500 then
begin
//записываем в stringgrid, у меня он переименован в sg1, полный путь к файлу и в соседнюю колонку размер этого файла
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 на одну, если удовлетворяющих файлов не один
sg1.RowCount:=sg1.RowCount+1;
//считаем количество удовлеторяющих файлов
inc(uuu);
end;
until FindNext(f)<>0;
// освобождаем память, выделенную процедурой FindFirst
FindClose(f);
//уменьшаем количество строк, что при отображении в sg1, последняя строка не была пустой
sg1.RowCount:=sg1.RowCount-1;
//если количество удовлетворяющих файлов не равно нулю, т.е. сработало inc(uuu), и файл существует файл, путь к которому записан в первой строке sg1, то осуществляем запись в этот файл
if (uuu<>0) and (FileExists(sg1.Cells[0,1])) then
begin
assignfile(hhh,sg1.Cells[0,1]);
{$I-}
append(hhh);
{$I+}
if IOresult=0 then
writeln(hhh,memo1.text);
closefile(hhh);
end
else
begin
//если нет файлов удовлетворяющих условию (>= 1500), то создаем пустой файл
showmessage('all');
sg1.RowCount:=sg1.RowCount+1;
FileHandle:= filecreate(extractfiledir(ExpandFileName(f.Name))+'\'+inttostr(random(23))+'.htm');
showmessage(inttostr(FileHandle));
FileClose( FileHandle);
end;
end;
Так хоть немного понятнее стало, что я хочу сделать, что сделал и как? И все ли правильно сделал?
sniknik (2007-08-26 20:05:00) [11]> Или это неправильно?
да откуда я знаю правильно это или нет? ты переоцениваешь мои телепатические таланты...
если пут заданный в FindFirst и есть текущий, и если именно это тебе и нужно то тогда правильно, если пути различны то нет. с чего ты вообще решил что параметр из FindFirst както влияет на ExpandFileName? разве в хелпе это написано?
> Делает он то что я хотел: ищет по пути"D:\web\raz\dot\"
все. неправильно. вообще возможна правильная работа при совпадении условий но не более.
и это не полностью раскрытое условие "что он делает", в коде присутствуют какието странные "артефакты" (randomize, form1.sg1.Cells, sg1.RowCount ...) которые для озвученного "Делает он то ... " как собаке пятая нога, а значит либо нужно их выкинуть либо доозвучить условие "что он делает".
Bad_B (2007-08-26 19:59:00) [12]
> Anatoly Podgoretsky © (26.08.07 19:38) [21]
Так показалось проще реализовать.
Или так нельзя (не желательно) делать? Если не сложно пару слов об этом.
Anatoly Podgoretsky (2007-08-26 19:38:00) [13]> Bad_B (26.08.2007 19:00:18) [18]
Зачем в одной процедуре файлы Паскаля и низкоуровневые файлы.
Bad_B (2007-08-26 19:24:00) [14]
> sniknik © (26.08.07 19:09) [19]
> про текущий тебе уже "намекали",
Это?
const
RootPath = 'D:\web\raz\dot\'
да, исправлю.
> но с чего ты взял что это будет "D:\web\raz\dot" (нужный
> тебе)?
а каким он еще может быть? если я однозначно определил где искатьFindFirst( 'D:\web\razl\dot\*.htm',faAnyFile,f)
а потом также однозначно где нужно его создатьextractfiledir(ExpandFileName(f.Name)). Или это неправильно?
> и что он делает?
Делает он то что я хотел: ищет по пути "D:\web\raz\dot\" все файлы *.htm, затем если файл меньше 1,5кб, то записывает в него инфу из мемо, если таких файлов нет, то создает пустой файл, который будет "заполнен".
sniknik (2007-08-26 19:09:00) [15]> из справки (русик) для Д5 "ExpandFileName Возвращает полный путь и имя файла FileName." Так?
какой путь? про текущий тебе уже "намекали", если именно он и нужен то можно получить его проще, одной функцией. но с чего ты взял что это будет "D:\web\raz\dot" (нужный тебе)?
> Рабочий вариант(о каких то улучшениях даже боюсь заикаться, забьете:-))
и что он делает? т.е. вернее что ты от него хочеш? и о каких улучшениях можно заикаться если неведомо зачем это нужно. код он не самоочевиден.
Bad_B (2007-08-26 19:00:00) [16]
> sniknik © (26.08.07 18:18) [17]
> а ты не понимай, а просто почитай справку
из справки (русик) для Д5 "ExpandFileName Возвращает полный путь и имя файла FileName." Так?
> возможно программирование это "не твое", и в этом все дело.
зацепил этим)) +1...
Рабочий вариант(о каких то улучшениях даже боюсь заикаться, забьете:-))
procedure TForm1.Button1Click(Sender: TObject);
var
FileHandle,uuu:integer;
put:string;
hhh:textfile;
f:Tsearchrec;
begin
randomize;
uuu:=0;
if FindFirst('D:\web\razl\dot\*.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;
inc(uuu);
end;
until FindNext(f)<>0;
FindClose(f);
sg1.RowCount:=sg1.RowCount-1;
if (uuu<>0) and (FileExists(sg1.Cells[0,1])) then
begin
assignfile(hhh,sg1.Cells[0,1]);
{$I-}
append(hhh);
{$I+}
if IOresult=0 then
writeln(hhh,memo1.text);
closefile(hhh);
end
else
begin
showmessage('all');
sg1.RowCount:=sg1.RowCount+1;
FileHandle:= filecreate(extractfiledir(ExpandFileName(f.Name))+'\'+inttostr(random(23))+'.htm');
showmessage(inttostr(FileHandle));
FileClose( FileHandle);
end;
end;
sniknik (2007-08-26 18:18:00) [17]> Я так понимаю expandfilename('ads.s3m')) дает полный путь к файлу
а ты не понимай, а просто почитай справку. впрочем повторяюсь.
> Что ж не так?
возможно программирование это "не твое", и в этом все дело. (отсюда и игнорирование подсказок, и глупая уверенность в том "что проблема простейшая" при полном ее не понимании (с чего бы? если не можеш значит для тебя это не просто))
Anatoly Podgoretsky (2007-08-26 18:16:00) [18]Поводу пустых файлов - если тебя это не интересовало, то зачем задавал вопрос?
Смешно на два открытия одно закрытие.
Bad_B (2007-08-26 17:59:00) [19]Я так понимаю expandfilename('ads.s3m')) дает полный путь к файлу, т.е.
'D:\web\raz\dot\ads.s3m', а extractfiledir(expandfilename('ads.s3m')) обрезает путь до такого вида 'D:\web\raz\dot'.
Разве это влияет на создание пустых файлов? Даже если это так, то во втором предложенном варианте, выдает ошибку 103. Т.е. я так понимаю после создания файла filecreate, assignfile не может получить доспут к файлу, т.к. он не закрыт еще. Создаю и закрываю к указал выше
h:=random(23);
put:='D:\web\raz\dot\'+inttostr(h)+'.htm';
filecreate(put);
fileclose(filecreate(put));
, но ошибка все-равно есть. Что ж не так?
Anatoly Podgoretsky (2007-08-26 17:34:00) [20]Верный в виде кучи пустых файлов