Форум » GUI » Рекурсия... Обход папок... » Ответить

Рекурсия... Обход папок...

Andrey: Всем привет... Собрался по удалять "мусор" у себя на винте. Решил написать в качестве пробы программку. Подскажите алгоритм обхода папок - но только рекурсивно... По обычному и сам знаю...

Ответов - 12

gfilatov2002: Andrey пишет: Подскажите алгоритм обхода папок - но только рекурсивно Посмотри исходники в папке samples\Applications\SafetyScan Andrey пишет: Собрался по удалять "мусор" у себя на винте Вышеуказанная программа предназначена именно для этой цели...

Andrey: Спасибо Григорий ! Я долго искал такую простую программу... А тут еще и с исходником... Красота...

Andrey: Блин, облом... Прога не ищет файлы с атрибутами: Только для чтения Архивный Скрытый Системный Мне нужно удалить файлы после Outpost'a: op_cache.atr и op_cache.idx ! В каждой папке оставил !!!


PSP: Команда DEL /S не подходит?

Andrey: PSP пишет: Команда DEL /S не подходит? Посыпаю голову пеплом.... Совсем не знал про ключ /S .... Придется как в том высказывание: Учите мат.часть Шура... Пошел учить.

Andrey: gfilatov2002 пишет: Посмотри исходники в папке samples\Applications\SafetyScan Посмотрел. Никак не могу переделать под себя. Требуется сделать ПОЛНЫЙ список файлов с путями ну допустим диска Д: Подскажите, как это (рекурсию) реализовать ?

Andrey: Нашел попроще: SAMPLES\BASIC\DirectoryRecurse Только никак не могу понять следующую конструкцию: if ProcName( 5 ) == "DIRECTORYRECURSE" return {} endif Подскажите что это такое ?

AndreyZh: Доброе утро! Если поможет, то изврат на фоксе (код 100% подойдёт (там слабые возможности работы с каталогами)): [pre2] * ------------------------------------------------------------------- * Удаление непустого каталога. Рекурсивно стираю все файлы с самого * нижнего уровня и удаляю каталоги от самого нижнего уровня. * Для реального удаления обращаюсь к подфункции function zDelDir parameters cDir do whil .t. if zAnalDel(cDir) exit endif enddo retu .t. * Анализ наличия каталогов. Удаление файлов и пустого каталога. function zAnalDel parameters cDir local n1, i1, cdIn, lRet, nm private cFile cdIn = Upper(Alltrim(cDir)) lRet = .t. * Если нет файлов или реальных подкаталогов. Выхожу по "истине" n1 = aDir(ad1,cdIn+iif(Right(cdIn,1)="\","*.*","\*.*"),"AD") if n1 <= 2 retu lRet endi * Делаю пока что-нибудь не удалю. do whil .t. n1 = aDir(ad1,cdIn+iif(Right(cdIn,1)="\","*.*","\*.*"),"AD") lRet = .t. * Определяю наличие подкаталога. for i1 = 1 to n1 if Trim(ad1[i1,1])="." OR Trim(ad1[i1,1])=".." loop endif if At("D",ad1[i1,5]) >= 1 cdIn = cdIn+iif(Right(cdIn,1)="\","","\")+Alltrim(ad1[i1,1]) lRet = .f. exit endi next * Подкаталог обнаружен. Ищем дальше вложенные подкаталоги. if !lRet loop else * Дошли до каталога самого низкого уровня. Удаляю все реальные файлы в нем и сам каталог. n1 = aDir(ad1,cdIn+"\*.*","A") * Удаляю все файлы каталога. for i1 = 1 to n1 cFile = cdIn+"\"+Alltrim(ad1[i1,1]) erase &cFile next * Удаляю уже пустой каталог. cFile = cdIn RMDIR &cFile * Каталог удалял. Процесс продолжаем. lRet = .f. endif exit enddo retu lRet[/pre2]

Andrey: Andrey пишет: Если поможет, то изврат на фоксе (код 100% подойдёт (там слабые возможности работы с каталогами)): Нет не поможет ! После примера SAMPLES\BASIC\DirectoryRecurse, другие не катят !!! MiniGUI - рулит ! Спасибо Григорию ! Там все четко и ясно ! Если интересно вот пример: #include "common.ch" FUNCTION MAIN(cDir) LOCAL aDim, nI, aResult LOCAL cFileLog := "Dir-List.txt" DEFAULT cDir TO "D:" aDim := DirectoryRecurse( cDir, "*.*", aResult) STRFILE("",cFileLog,.F.) FOR nI := 1 TO LEN(aDim) ? nI, aDim[nI,1] STRFILE(aDim[nI,1]+HB_OsNewLine(),cFileLog,.T.) NEXT RETURN NIL *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ Static Function DirectoryRecurse( cPath, cFileMask, aResult ) local aFiles := Directory( cPath + "\*.*", "D" ) local aFindMask := Directory( cPath + "\" + cFileMask ) local n if ProcName( 5 ) == "DIRECTORYRECURSE" return {} endif if aResult == NIL aResult := {} endif if Len( aFindMask ) > 0 Aeval( aFindMask, { |e| if( "TMP" $ e[ 1 ] .or. !"." $ e[ 1 ], , Aadd( aResult, {cPath + "\" + e[ 1 ], e[ 2 ], e[ 3 ], e[ 4 ], e[ 5 ]} ) ) } ) endif for n := 1 to Len( aFiles ) if "D" $ aFiles[ n ][ 5 ] .and. ! ( aFiles[ n ][ 1 ] $ ".." ) DirectoryRecurse( cPath + "\" + aFiles[ n ][ 1 ], cFileMask, aResult ) endif next Return aResult

AlexMyr: Andrey пишет: MiniGUI - рулит ! MiniGUI тут не поможет. Andrey пишет: Если интересно вот пример: Скрытый текст Это чистый код на Harbour, а MiniGUI - пользовательский графический интерфейс. Не нужно вводить других в заблуждение

Andrey: AlexMyr пишет: Это чистый код на Harbour, а MiniGUI - пользовательский графический интерфейс. Я в том смысле, что в MiniGui - куча примеров !!! А в поставке Harbour их нет ! AlexMyr пишет: Не нужно вводить других в заблуждение Не буду !

Andrey: Кто нибудь может объяснить зачем в aDim := DirectoryRecurse( cDir, "*.*", aResult) задавать aResult ??? Пример: #include "common.ch" FUNCTION MAIN(cDir) LOCAL aDim, nI, aResult LOCAL cFileLog := "Dir-List.txt" DEFAULT cDir TO "D:" aDim := DirectoryRecurse( cDir, "*.*", aResult) STRFILE("",cFileLog,.F.) FOR nI := 1 TO LEN(aDim) ? nI, aDim[nI,1] STRFILE(aDim[nI,1]+HB_OsNewLine(),cFileLog,.T.) NEXT RETURN NIL *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ Static Function DirectoryRecurse( cPath, cFileMask, aResult ) local aFiles := Directory( cPath + "\*.*", "D" ) local aFindMask := Directory( cPath + "\" + cFileMask ) local n if ProcName( 5 ) == "DIRECTORYRECURSE" return {} endif if aResult == NIL aResult := {} endif if Len( aFindMask ) > 0 Aeval( aFindMask, { |e| if( "TMP" $ e[ 1 ] .or. !"." $ e[ 1 ], , Aadd( aResult, {cPath + "\" + e[ 1 ], e[ 2 ], e[ 3 ], e[ 4 ], e[ 5 ]} ) ) } ) endif for n := 1 to Len( aFiles ) if "D" $ aFiles[ n ][ 5 ] .and. ! ( aFiles[ n ][ 1 ] $ ".." ) DirectoryRecurse( cPath + "\" + aFiles[ n ][ 1 ], cFileMask, aResult ) endif next Return aResult



полная версия страницы