|
Вопрос # 5 254/ вопрос решён / |
|
Приветствую, уважаемые эксперты! Можно ли сделать рекурсивный поиск(может этот поиск уже будет не рекурсивным, а немного иначе), неиспользуя form,методы, procedure, function. В данный вопрос постарайтесь писать исключительно для дела. Я могу не отвечать на вопросы, некасающие самой главной проблемы.
Примечания: 1.поиск по диску C
2.поиск по 3 подпапкам(много не требуется)
3.удовлетворяющий ответ будет хорошо оценен
 |
Вопрос задал: Кудя (статус: Посетитель)
Вопрос отправлен: 5 мая 2011, 16:43
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Кудя!
Хотя я знаю, как исправить код:) Уровень телепатии зашкаливает, мозг кипит, но решение придумано:)
Не гарантирую, что он заработает, но попробуйте.
uses
Classes,
windows,
System,
dialogs,
messages,
SysUtils;
//----------------------------------------------------------------------------
var
SR: TsearchRec;
SR2: TsearchRec;
SR3: TsearchRec;
//-----------------------------------------------------------------------------
begin
if FindFirst('C:\*',fadirectory,SR)=0 then
repeat
if ((SR.Attr and faDirectory) <> 0) and (SR.Name <> '..') and (SR.Name <> '.') then begin
showmessage('1.'+'C:\'+SR.name);
if FindFirst('C:\'+SR.Name+'\*',fadirectory,SR2)=0 then
repeat
if ((SR2.Attr and faDirectory) <> 0) and (SR2.Name <> '..') and (SR2.Name <> '.') then begin
showmessage('2.'+'C:\'+SR.Name+'\'+SR2.Name);
if FindFirst('C:\'+SR.Name+'\'+SR2.Name+'\*',fadirectory,SR3)=0 then
repeat
if ((SR3.Attr and faDirectory) <> 0) and (SR3.Name <> '..') and (SR3.Name <> '.') then
showmessage('3.'+'C:\'+SR.Name+'\'+SR2.Name+'\'+SR3.Name);
until FindNext(SR3)<>0 ;
SysUtils.FindClose(SR3);
end;
until FindNext(SR2)<>0 ;
SysUtils.FindClose(SR2);
end;
until FindNext(SR)<>0 ;
SysUtils.FindClose(SR);
end.
Код нужно ещё раз 10 выверить, но идея думаю ясна
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 5 мая 2011, 19:15
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое!
|
Мини-форум вопроса
Всего сообщений: 39; последнее сообщение — 5 мая 2011, 19:33; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 5 мая 2011, 17:02 [#1]:
пункт 2 - подпапки всегда одни и те же?
пункт 3 - если оценка за ответ будет 100 балов - берусь
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 5 мая 2011, 17:05 [#2]:
Цитата (Кудя):
неиспользуя form,методы, procedure, function
Я тебя правильно понял: тебе нужно в самом теле программы сделать рекурсивный поиск файлов, не используя никакие подпрограммы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:11 [#3]:
Вадик К: подпапки могут быть разными
min@y™: правильно понял
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 17:15 [#4]:
и глубина произвольная?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:16 [#5]:
см. примечание 2.
Просто, когда вы мне покажите\посоветуете\подталкнёте на верную мысль я сам смогу решить, сколько подпапок перебрать программе.
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 17:23 [#6]:
поиск по трем подпапкам? это глубина одно вложение.
в данном случае правильным решением будет просто запустить find . -name "name" через WinExec, но у тебя одна проблема - не та операционная система.
Ты можешь нагородить свой стек. Но это тоже печально и муторно.
У меня есть ещё с десяток идей, как это можно сделать, но к сожалению, они для Вас не под силу.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:27 [#7]:
Я не такой глупый, как кажусь на первый взгляд, я стремлюсь получше познать delphi. Мне нужна одна ваша идея, но только она должна работать. Даже если я немного непойму её, я всё равно её изучу, мне самому веть интересно. Прошу вас, поделитесь идеей
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 17:29 [#8]:
приложение будет запускать само себя с параметром, который равный каталогу для поиска.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:37 [#9]:
Уххтыы. А у вас есть пример этого кода?
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 17:40 [#10]:
Пример будет только после того, как обосновано расскажите зачем это нужно. Если нет - будет считать вопрос глупым и закроем.
Ответ типа "мне интересно", "препод задал", "поспорил с друзьями" и подобные не принимается.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:46 [#11]:
Блин. Мне 14 лет, я люблю писать на делфи, я много всего пробывал, перед тем как я вам задал вопрос, я много мучался, я пытался сделать поиск в ручную, но у меня была проблема: после until
FindNext(SR)<>0 ;
SysUtils.FindClose(SR);
значение поисковой переменной резко меняется, и поэтому дальше поиск не шёл, я с психики переудалял всё, теперь пытаюсь что-нибудь другое, уже как месяц голосу ломаю. на самом деле мне интересно. Ну ладно, простите что теряю ваше время, буду искать дальше. Удачи.
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 17:50 [#12]:
Цитата (Кудя):
значение поисковой переменной резко меняется
Так это же правильное, поведение! если мы закрываем поиск, то какой смысл его делать дальше? а после закрытия значения переменной неопределенно. то есть там может быть что угодно.
Примеров поиска тут было уже на форуме куча. И пример от min@y™ вполне себе был очень хорош для изучения.
Я рекомендую начать с простых примеров. А потом заняться извращениями.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 17:54 [#13]:
А если убрать FindClose, то значение переменной останется? И прога небудет ругаться?
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 18:01 [#14]:
Покажите код.
В общем - лучше findClose не убирать - чревато ошибками.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Кудя (статус: Посетитель), 5 мая 2011, 18:03 [#15]:
с психики я удалил проект, если вы подождёте минут 30, я его заново напишу
Think Different. (c)
|
|
min@y™ (статус: Доктор наук), 5 мая 2011, 18:04 [#16]:
Цитата (Кудя):
А если убрать FindClose, то значение переменной останется? И прога небудет ругаться?
Ругаться не будет, но будет утечка памяти. И мне интересно, как ты эту переменную будешь использовать дальше, даже без FindClose()?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кудя (статус: Посетитель), 5 мая 2011, 18:07 [#17]:
ну в самом самом конце программы я напишу findclose, если это надо
Think Different. (c)
|
|
Вадим К (статус: Академик), 5 мая 2011, 18:08 [#18]:
Цитата (Кудя):
с психики я удалил проект
психовать не стоит. нервы ведь не железные. Хороший программист должен иметь железные нервы и быть спокойным как стена или танк (как минимум). любые проблемы в коде его не должны выводить из себя.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 5 мая 2011, 18:13 [#19]:
Цитата (Кудя):
ну в самом самом конце программы я напишу findclose, если это надо Это ты зря. Память-то выделяет функция FindFirst(). А её-то ты будешь вызывать несколько раз.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Кудя (статус: Посетитель), 5 мая 2011, 18:13 [#20]:
нервы у меня слабые не из-за неудач в програмировании, а из-за личных проблем
Think Different. (c)
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|