Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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™

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™

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™

min@y™ (статус: Доктор наук), 5 мая 2011, 18:13 [#19]:

Цитата (Кудя):

ну в самом самом конце программы я напишу findclose, если это надо
Это ты зря. Память-то выделяет функция FindFirst(). А её-то ты будешь вызывать несколько раз.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Кудя

Кудя (статус: Посетитель), 5 мая 2011, 18:13 [#20]:

нервы у меня слабые не из-за неудач в програмировании, а из-за личных проблем
Think Different. (c)

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.