:: Visual Foxpro, Foxpro for DOS
Найти глубину каталога
tmp_adr

Сообщений: 185
Дата регистрации: 29.10.2007
Здравствуйте, если дан каталог, в нём находятся подкаталоги и т.д., как можно найти максимальное количество подкаталогов в этой папке, не учитывая скрытые и системные папки. Конечно можно батовским файлом поискать командой dir /b /s /a:d-s-h с последующей сортировкой, но эта команда исключает скрытые каталоги, только на первом уровне, а дальше в список включаются скрытые и системные каталоги. Фокс игнорирует скрытые и системные, но вот как глубоко он может зайти и как найти максимальную глубину этого каталога. т.е. в итоге должно получиться , "больше всего каталогов 20 находится по пути c:\user\Иванов\Рабочий стол\и т.д."
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
рекурсивная функция с ADIR() внутрях - и сколь угодно глЫбоко можно копать ))
Ratings: 0 negative/2 positive
Re: Найти глубину каталога
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
forum.foxclub.ru

forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
AndyNigmatec
рекурсивная функция с ADIR() внутрях - и сколь угодно глЫбоко можно копать ))
Неужели "сколь угодно"?

А как скоро вы получите
Allowed DO nesting or expression evaluation level exceeded.
?

Не нужна для решения задачи никакая рекурсия - достаточно одного простого цикла по списку папок, в котором изначально находится только один элемент - корневая папка.
Двигаясь по этому списку папок сверху вниз, сканируем содержимое текущей папки, дописывая в конец списка имена встретившихся подпапок.
И когда этот список будет пройден до конца, это и будет означать, что всё дерево папок пройдено.

Пример начальных шагов:
Папка1 (корневая папка)
__Папка1-1 (1-я подпапка в Папке1)
__Папка1-2 (2-я подпапка в Папке1)
____Папка1-1-1 (1-я подпапка в Папке1-1) [не имеет подпапок]
____Папка1-2-1 (1-я подпапка в Папке1-2) [не имеет подпапок]
____Папка1-2-2
____Папка1-2-3
______Папка1-2-2-1
и т.д.

Отступы условно показывают уровень вложенности.

Список, на мой взгляд, наиболее удобно делать на основе курсора, поместив в него изначально одну запись - для корневой папки.
Тогда цикл представляет собой обычный SCAN этого курсора.
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
akvvohinc
А как скоро вы получите
Allowed DO nesting or expression evaluation level exceeded.
?

Ну так это зависит от настроек. Думаю, 64000 для решения данной задачи вполне хватит.
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
leonid
Ну так это зависит от настроек. Думаю, 64000 для решения данной задачи вполне хватит.
Вы о STACKSIZE?

Я не знаю, сколько хватит именно ТС.
Но шансы получить переполнение стека (Insufficient stack space) велики. А главное, заранее не знаешь, где, когда и почему рванёт.
Сейчас проверил - у меня "пустая" рекурсия в отдельном PRG при максимальном стеке свалилась на 743, 910 и ещё раз на 910-м уровне на трех разных компах (Win10, 7 и XP), причем, на Win10 (где 743) я получил Fatal Error 308 и пустое Фокс-окошко вместо Insufficient stack space.

Проводить исследования, от каких характеристик/настроек компа, Фокса и/или запущенных программ это зависит? - не мой путь - не верю, что он может что-либо более-менее гарантировать в общем случае.

Не знаю, кому как, но у меня ещё со времен ДОСа сложилось стойкое неприятие к рекурсии в Фоксе - хотя раньше в основном из-за слишком малого допустимого уровня вложенности программ.

Так что в любом случае, если можно обойтись без неё и одновременно танцев с бубнами, я рекурсией пользоваться не буду - это красиво только в теории.
Ratings: 0 negative/1 positive
Re: Найти глубину каталога
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
akvvohinc
это красиво только в теории.

Сейчас конечно не вспомню конкретно, но помнится, встречались задачи, которые рекурсией решались на порядок-другой проще, чем без нее.
Ratings: 0 negative/1 positive
Re: Найти глубину каталога
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
leonid
встречались задачи, которые рекурсией решались на порядок-другой проще, чем без нее.
Согласен, наверняка такие могут быть - тогда другое дело (если программа ещё и не валится время от времени).
Но это я и назвал выше "и без танцев с бубнами", а в данной теме как раз они и не требуются при отказе от рекурсии - алгоритм простой и прозрачный (и проверенный на практике еще со времен ДОСа. )



Исправлено 1 раз(а). Последнее : akvvohinc, 08.06.23 00:46
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
tmp_adr

Сообщений: 185
Дата регистрации: 29.10.2007
Спасибо за ответы, вроде бы так примерно powershell "ls -Path с:\Users\Иванов\ -Directory -Recurse >111.txt выдаёт список без скрытых каталогов на всём протяжении, в отличии от dir, а далее парсить текстовик и подсчитывать слеши



Исправлено 1 раз(а). Последнее : tmp_adr, 08.06.23 08:18
Ratings: 0 negative/1 positive
Re: Найти глубину каталога
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Хотя задача ТС и решена, но данный способ (ADIR()+рекурсия) я давно использую для построения структуры каталогов (и перчня файлов) ... конечно уровня вложенности даже 100 никогда не достигал ... ну не встречалось столь глЫбоко закопанных файлов. Собсно никто не мешает програмно ограничить рекурсию той же сотней к примеру... сейчас глянул - у меня в классе так и сделано ))


Ну собсно сам класс приложил, вдруг кому-нить пригодится.

использование (пример), результат выводится в указанный курсор (в примере - cDirTest):

oDir=CREATEOBJECT('dirinfo', 'cDirTest')
oDir.GetList('C:\Work\Conc\', 0, 0, 'C:\Work\Conc\', 0)
RELEASE oDir
Ratings: 0 negative/2 positive
Re: Найти глубину каталога
tmp_adr

Сообщений: 185
Дата регистрации: 29.10.2007
Спасибо
Ratings: 0 negative/0 positive
Re: Найти глубину каталога
akvvohinc
Автор

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
tmp_adr
Спасибо за ответы, вроде бы так примерно powershell "ls -Path с:\Users\Иванов\ -Directory -Recurse >111.txt выдаёт список без скрытых каталогов на всём протяжении, в отличии от dir, а далее парсить текстовик и подсчитывать слеши
Парсить текстовик?
Powershell способен экспортировать данные в CSV и XML.
Почитайте также про файлы форматирования.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 33 _vit  (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика