for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
   :: Помощь сайту :: 

Поиск папок и файлов по шаблону
VeterVFP
Автор

Сообщений: 347
Откуда: Москва
Дата: 29.05.18 17:48:41ОтветитьЦитировать
Приветствую.

Через 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

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
of63

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

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

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



Исправлено: of63, 29.05.18 23:01
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 31838
Дата: 29.05.18 22:57:48ОтветитьЦитировать
of63
какой массив вы хотели бы получить из ADIR в вашем случае?

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
of63

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

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



Исправлено: of63, 29.05.18 23:08
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 820
Откуда: Волгоград
Дата: 29.05.18 23:44:20ОтветитьЦитировать
:xixi: прорвало Олега

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

Re: Поиск папок и файлов по шаблону
of63

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

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



Исправлено: of63, 30.05.18 00:31
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
AndyNigmatec

Сообщений: 820
Откуда: Волгоград
Дата: 30.05.18 08:24:46ОтветитьЦитировать
Тю, в чем проблема то ... вот она кода ))) раскопал и выдрал, старая, но рабочая ...

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


Вложения:
[dirinfo.zip (2.2KB)]  

Re: Поиск папок и файлов по шаблону
VeterVFP
Автор

Сообщений: 347
Откуда: Москва
Дата: 30.05.18 11:10:31ОтветитьЦитировать
Игорю спасибо за разъяснение. Инфу принял
Олегу за "философию" и "выклянчивание" кОдеса у Андрея
Андрей, процедуру забрал для изучения. Спасибо! :hi:
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
Igor Korolyov

Сообщений: 31838
Дата: 30.05.18 12:52:06ОтветитьЦитировать
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




Исправлено: Igor Korolyov, 31.05.18 14:39
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
akvvohinc

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

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

Re: Поиск папок и файлов по шаблону
of63

Сообщений: 11498
Откуда: Н.Новгород
Дата: 31.05.18 17:40:54ОтветитьЦитировать
Ограничение на длину имени файла в винде раньше сработает (ок. 255 символов), если только не делать однобуквенных директориев 128 шт
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
of63

Сообщений: 11498
Откуда: Н.Новгород
Дата: 31.05.18 18:19:01ОтветитьЦитировать
Вот прога, которая с рекурсией, попробуйте. У меня в проекте какой-то дремучиий вариант, а этот нативный. Заточен под поиск файлов по маске, в поддиректориях, поддиректории по маске не разбираются, но можно и приделать (для этого надо приделать в интерфейс маску для поддиректориев...). Упор был сделан на похожесть интерфейса на штатный интерфейс ADIR. ...Типа, набираем ADIR в IDE фокса, IntelliSence подсказывает синтаксис, мы набираем команду, а потом чуть подменяем имя функции на нашу, и она возвращает нам имена с путями.

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



Исправлено: of63, 31.05.18 18:34
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
AndyNigmatec

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

Re: Поиск папок и файлов по шаблону
Igor Korolyov

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
of63

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

Re: Поиск папок и файлов по шаблону
AndyNigmatec

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

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



Исправлено: AndyNigmatec, 31.05.18 19:33
Ratings: 0 negative/0 positive

Re: Поиск папок и файлов по шаблону
of63

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

Re: Поиск папок и файлов по шаблону
AndyNigmatec

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



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

On-line: 54 Simple777  and Guests: 53


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