:: Visual Foxpro, Foxpro for DOS
Поиск папок и файлов по шаблону
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Приветствую.

Через ADIR спокойно получаю список файлов ПО МАСКЕ в КОНКРЕТНО заданных папках.
Но как получить такой список, если в именах папок тоже есть маска?
Пример
CLEAR
CLOSE DATABASES
cDBPath= 'D:\DB_TEST\'
IF !DIRECTORY(cDBPath, 1)
MD (cDBPath)
ENDIF
IF !DIRECTORY(cDBPath+ 'TEST', 1)
MD (cDBPath+ 'TEST')
ENDIF
IF !DIRECTORY(cDBPath+ 'TEST_2', 1)
MD (cDBPath+ 'TEST_2')
ENDIF
SET DEFAULT TO (cDBPath)
cTempl_1= cDBPath+ 'TEST\Test_*'
cTempl_2= cDBPath+ 'TEST*\Test_*'
**
CREATE TABLE (cDBPath+ 'TEST\Test_1') (l_Test L)
CREATE TABLE (cDBPath+ 'TEST\Test_2') (l_Test L)
**
CREATE TABLE (cDBPath+ 'TEST_2\Test_2_1') (l_Test L)
CREATE TABLE (cDBPath+ 'TEST_2\Test_2_2') (l_Test L)
**Шаблон 1 (только для имени файла)
? '** Шаблон 1'
nFileCnt= ADIR(aDBFFilesArr, cTempl_1+ '.DBF', 'DAHRS', 1)
IF nFileCnt > 0
? aDBFFilesArr(1,1)
? aDBFFilesArr(2,1)
ELSE
? ' no exist'
ENDIF
?
RELEASE aDBFFilesArr
**Шаблон 2 (для папки и файла)
? '** Шаблон 2'
nFileCnt= ADIR(aDBFFilesArr, cTempl_2+ '.DBF' ,'DAHRS', 1)
IF nFileCnt > 0
? aDBFFilesArr(1,1)
? aDBFFilesArr(2,1)
ELSE
? ' no exist'
ENDIF
CLOSE DATABASES
RETURN

Можно ли этого добиться или придется много-ходовку какую-то делать с циклом?
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
"Добиться" того чтобы функция ADIR() работала не так как она сделана, задумана и описана в хелпе, конечно же нельзя. Реализовать алгоритм используя рекурсию, или циклы с наполнением промежуточных курсоров/массивов результатами прохода по иерархии объектов файловой системы - не составляет решительно никаких проблем.
Второй параметр функции, к сожалению, является по сути двумя независимыми параметрами (возможно это как раз и приводит к "недоразумению"). Необязательным ПУТЁМ (абсолютным или относительным) к некоторому каталогу (по умолчанию берётся текущий) и "шаблоном поиска" (search criterion или file skeleton). подстановочные символы допустимы лишь в этом самом шаблоне поиска, но не в пути. ADIR() ищет файлы всегда исключительно в ОДНОМ и строго определённом каталоге.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() заранее известно, что предлагаемый путь путь придется разобрать на подпути (рекурсивно конечно, рассматривая каждый в конце подпуть в конце...

> Через ADIR спокойно получаю список файлов
> Но как получить такой список, если в именах папок тоже есть маска?
ТС понимает ли, в каком виде он хочет получить массив чисто имен, ... какой массив вы хотели бы получить из ADIR в вашем случае?

Доб. Неприятности в "произвольном LIKE-подобном указании пути" будут такие, например C:\*\myLikeCat\*.*
Вы будете вынуждены В ЛЮБОМ СЛУЧАЕ посмотреть на весь C:\*.*, или его подмножества (бывает и не слабого обьема)...



Исправлено 1 раз(а). Последнее : of63, 29.05.18 23:01
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
какой массив вы хотели бы получить из ADIR в вашем случае?

Что за вопрос - конечно же "правильный"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ф имел введу, что в первой колонке - ЧИСТО ИМЯ файла, с расширением. В У предлагаемой теории (мой стайл) предлагается возвращать имя с ПУТЕМ (относително запрошенного пути... БЛИН ЗАДРАЛСЯ ПИСАТЬ!
)

Татьяне написал аналог ADIR. Все просто! Рекурсия - ПРОСТО (кто не может понять - пусть проходят мимо), Кто не может поняьб Си шарпы - тоже пусть идут мимо. Здесь фоксовое болото. И вобще... относитесь к фоксистам не как к отстойникам и дегенератам )



Исправлено 1 раз(а). Последнее : of63, 29.05.18 23:08
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
:xixi: прорвало Олега

По топику - сам так делал, в функции ADIR, организовывал ее рекурсивный вызов, в итоге пробегала по всем вложенным папкам начиная с указанной, на выходе курсор с путями и файлами ... и как говорится делай с ним что хошь )))
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
И главное - умение отсечь лишние детали пути, Андрей... Давай код Андрей, иначе это все ничего не стОит, это так ) Даже поверю, что кодес есть )

Доб. - youtu.be - всеми любимый ДП
() Напился, поискал на нашем форуме слово "радуюсь"... не нашлось - нашлось... наш сайт так и будет тупеть и умирать? Давайте его похерим что-ли... Шутка, конечно, но блин, ну это надо как то содержать , модернизировать соотсв с временем... Доброхотов кроме Боба и Джойса (и Максимова) походу нету?... Странно, у них то что за интерес...



Исправлено 2 раз(а). Последнее : of63, 30.05.18 00:31
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Тю, в чем проблема то ... вот она кода ))) раскопал и выдрал, старая, но рабочая ...

Для своих специфических нужд когда-то делал ... причесать, повыкидывать лишнее
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
Игорю спасибо за разъяснение. Инфу принял
Олегу за "философию" и "выклянчивание" кОдеса у Андрея
Андрей, процедуру забрал для изучения. Спасибо! :hi:
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
И главное - умение отсечь лишние детали пути
Это уже частная задача - помимо прохода по вложенным каталогам, ещё и определённое "правило совпадения" к именам каталогов применять. Я, честно говоря, с такой потребностью никогда не сталкивался - все рекурсивные обходы дерева файловой системы всегда требовались БЕЗ отсева каталогов - т.е. без "масок" для них. Вот файлы - те да, обычно не все подряд а по той или иной маске отбирались (чаще по расширению имени файла, и при том не в самом ADIR() ограничение задавалось, т.к. там несколько вариантов не указать, а в последующем коде цикла по массиву со всеми именами файлов). Т.е. грубо говоря это практически всегда код типа:

PROCEDURE ProcessDir(tcPath)
LOCAL lnCnt, ln1, laFiles(1), lcExt, lcFile
lnCnt =ADIR(laFiles, m.tcPath + "*.*", "D", 1)
FOR ln1 = 1 TO m.lnCnt
IF !(m.laFiles[m.ln1, 1] == "." OR m.laFiles[m.ln1, 1] == "..") && Skip special entries
IF "D" $ m.laFiles[m.ln1, 5] && Folder must be processed recursively
ProcessDir(ADDBS(m.tcPath + m.laFiles[m.ln1, 1]))
ELSE
lcExt = LOWER(JUSTEXT(m.laFiles[m.ln1, 1]))
lcFile = m.tcPath + m.laFiles[m.ln1, 1] && Full path
DO CASE
CASE m.lcExt == "abc"
ProcessABC(m.lcFile)
CASE m.lcExt == "def"
ProcessDEF(m.lcFile)
...
ENDCASE
ENDIF
ENDIF
ENDFOR

Думаю вполне очевидно куда надо вставлять условие для фильтрации ещё и имён папок, раз уж возникла такая нужда

P.S. поправил сравнение имён для псевдо-папок "." и ".." - т.к. при штатной установке SET EXACT OFF функция INLIST() не подходит, т.к. работает по "начальным символам", а не по точному совпадению всех символов сравниваемых строк. Впрочем, иногда именно папки имена которых начинаются с точки и требуется отбрасывать из обработки


------------------
WBR, Igor




Исправлено 2 раз(а). Последнее : Igor Korolyov, 31.05.18 14:39
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Рекурсия - это неплохо, если бы в Фоксе не было ограничения на program nesting levels - всего 128.
Я бы не стал пользоваться рекурсией для решения этой задачи - никогда не знаешь, в какой момент "рванет".

Ограничения на размер и количество записей в таблице выглядят более привлекательными - бежишь себе по курсору, дописывая в конец содержимое элементов ADIR(), когда наталкиваешься на папку - обходишься единственным сканом и никаких рекурсий.
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ограничение на длину имени файла в винде раньше сработает (ок. 255 символов), если только не делать однобуквенных директориев 128 шт
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В 9-ке есть в конфиге STACKSIZE - до 64К можно поднять уровень вложенности. Но я полагаю что вряд ли на фоксе стоит решать задачи требующие обхода НАСТОЛЬКО глубоко вложенных папок Это ж по сути надо от корня диска начинать, да и далеко не на всяком обычном юзерском диске найдутся хотя-бы 20 уровней вложенности папок...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вот прога, которая с рекурсией, попробуйте. У меня в проекте какой-то дремучиий вариант, а этот нативный. Заточен под поиск файлов по маске, в поддиректориях, поддиректории по маске не разбираются, но можно и приделать (для этого надо приделать в интерфейс маску для поддиректориев...). Упор был сделан на похожесть интерфейса на штатный интерфейс ADIR. ...Типа, набираем ADIR в IDE фокса, IntelliSence подсказывает синтаксис, мы набираем команду, а потом чуть подменяем имя функции на нашу, и она возвращает нам имена с путями.
Часть текста скрыта
CLEAR
RELEASE AAA
DIMENSION AAA[1]
m.d = GETDIR()
IF EMPTY(m.d)
RETURN
ENDIF
? aDirADIR(@AAA, ADDBS(m.d)+"*.pjx", "") && пример.
? m.d
m.l = IIF(ALEN(AAA)=1, 0, ALEN(AAA,1))
FOR m.i=1 TO m.l
? AAA[m.i,1]
ENDFOR
? m.l
RETURN
FUNCTION aDirADIR
LPARAMETERS m.parMASS, m.parFile, m.parAttr, m.parFlag, m.parAppDir && Не задавать "D" в параметре 3 (это сделается само)
PRIVATE ALL LIKE ?
m.p = PCOUNT()
#DEFINE Самовызов aDirADIR
LOCAL m.parAttr_eff, m.parFlag_eff && если не заданы параметры 3,4
m.parAttr_eff = IIF(m.p<3, "", m.parAttr) && атрибуты поиска H,D... D не задавать
m.parFlag_eff = IIF(m.p<4, 0, m.parFlag) && 0|1|2 - UPPER Original MSDOS
LOCAL m.rekurs_put && путь-добавок к основному пути при рекурсивном вызове. NULL в первичном вызове
m.rekurs_put = .NULL.
IF m.p>=5 .AND. !ISNULL(m.parAppDir) && это рекурсивный вызов
m.rekurs_put = m.parAppDir
ELSE && первичный вызов
EXTERNAL ARRAY parMASS && сброс (@1) в первичном вызове
DIMENSION parMASS[1]
STORE "" TO parMASS
ENDIF
LOCAL m.maska, m.put && маска файлов и первичный путь. Даже в Самовызове будем его передавать в первичном виде
m.put = JUSTPATH(m.parFile) && m.parFile задавать с путем и маской
m.maska = JUSTFNAME(m.parFile)
LOCAL m.put_eff && эффективный путь (с рекурсивным подпутем)
m.put_eff = RTRIM(ADDBS(m.put) + NVL(m.rekurs_put, ""), 1, "\") && эффективный путь, без слэша в конце
* 1. Читаем все файлы (но не директории), СОГЛАСНО МАСКЕ. Записываем имя (и пр.) в выходнй массив (@1)
RELEASE Z
***********************************************************************
m.l = ADIR(Z, ADDBS(m.put_eff) + m.maska, m.parAttr_eff, m.parFlag_eff)
***********************************************************************
m.k = IIF(ALEN(m.parMASS)=1, 0, ALEN(m.parMASS,1)) && размер выходного массива (@1)
FOR m.i=1 TO m.l && добавляем массив файлов Z к выходному массиву (@1)
IF EMPTY(CHRTRAN(Z[m.i,1], ".", "")) .OR. "D"$UPPER(Z[m.i,5]) && не смотрим на директории, и на корневые
LOOP
ENDIF
m.k = m.k + 1
DIMENSION m.parMASS[m.k, ALEN(Z,2)]
FOR m.j=1 TO ALEN(Z,2)
m.parMASS[m.k, m.j] = IIF(m.j=1, IIF(ISNULL(m.rekurs_put), "", ADDBS(m.rekurs_put)) + Z[m.i, m.j],; && имя файла записываем С ДОБАВЛЕНИЕМ РЕКУРСИВНОГО ПУТИ
Z[m.i, m.j]) && остальные элементы без изменений
ENDFOR
ENDFOR && добавляем массив файлов Z к выходному массиву (@1)
RELEASE Z
* 2. Читаем все директории, БЕЗ МАСКИ. Делаем Самовызов на каждом поддиректории
RELEASE Z
*************************************************************************
m.l = ADIR(Z, ADDBS(m.put_eff) + "*.*", "D"+m.parAttr_eff, m.parFlag_eff)
*************************************************************************
FOR m.i=1 TO m.l && делаем Самовызов на каждом поддиректории Z
IF EMPTY(CHRTRAN(Z[m.i,1], ".", "")) .OR. !"D"$UPPER(Z[m.i,5]) && смотрим только на ПОДдиректории
LOOP
ENDIF
*************************************************************************
=Самовызов(@parMASS, m.parFile, m.parAttr_eff, m.parFlag_eff,; && рассматриваем содержимое подкаталога
IIF(ISNULL(m.rekurs_put), "", ADDBS(m.rekurs_put)) + Z[m.i,1]) && 5й параметр даст понять самовызову, что это уже не первичный вызов, а рекурсивный. Здесь рекурсивный путь
*************************************************************************
ENDFOR && делаем Самовызов на каждом поддиректории Z
RELEASE Z
m.k = IIF(ALEN(m.parMASS)=1, 0, ALEN(m.parMASS,1)) && размер выходного массива (@1)
RETURN m.k
#UNDEFINE Самовызов


Доб. Про передачу "второго" параметра (задать маску для директориев) - сделал бы так: вот у нас 2м параметром ADIR строка (путь и маска в одном флаконе - обычный путь к файлу). Решение - приделываем опциональную вторую подстроку, через CHR(13). В самой нашей ф-ии читаем строку-маску, и если она состоит из двух строк, то первая - это как обычно путь+маска, вторая - маска на поддиректории.



Исправлено 2 раз(а). Последнее : of63, 31.05.18 18:34
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
akvvohinc
program nesting levels - всего 128
для 99% случаев думаю хватит ... и "рвануть" не обязано - можно же предусмотреть заглушку на 127-ом шаге
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не на "шаге", а на PROGRAM(-1). Так то ты не знаешь с какого уровня стека запустят твою функцию


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
(заглушки и предохранители - это хорошо, но во что превратится прога, в сплошные IF-ы, и раздумья "что же вернуть из подпрограммы, если параметр передан не ожидаемые ею..., и генерить ли ошибку...". Приходится считать все операторы потенциально всеядными, т.е. безошибочными, но некоторые, которые типа "дисковые", или "число м.б. большим", или "хз че там примется при импорте" - мы обрамляем в TRY (и опять, а что делать если ошибка?))
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
AndyNigmatec

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

Тут другая проблемка - с обходом папок куды у юзверя доступа нету - это надо было бы разрулить (в том древнем что я выкладывал это не решено фактически)



Исправлено 1 раз(а). Последнее : AndyNigmatec, 31.05.18 19:33
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
of63
Автор

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> куды у юзверя доступа нету
А фокс как это решает? Ответ - никак. В наших "прогах" мы не суемся за пределы видения файловой системы фоксом и его юзером. Будет ошибка, если нам дали видеть директорий, которого нам видеть не должно. Вобщем, по опыту с файл-сервером, ниче плохого не будет. В локально сети есть понятие "Ресурс", ничего не разшареного ADIR не увидит.
Ratings: 0 negative/0 positive
Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
в новомодных виндах adir таки полезет (увидит) папки читать которые не сможет (я про локальные) ...
Ratings: 0 negative/0 positive


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

On-line: 23 (Гостей: 23)

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