Автор | Сообщение |
|
| постоянный участник
|
Пост N: 1139
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.10 11:07. Заголовок: Рекурсия... Обход папок...
Всем привет... Собрался по удалять "мусор" у себя на винте. Решил написать в качестве пробы программку. Подскажите алгоритм обхода папок - но только рекурсивно... По обычному и сам знаю...
|
|
|
Новых ответов нет
[см. все]
|
|
|
| moderator
|
Пост N: 13
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.03.10 12:41. Заголовок: Andrey пишет: Подск..
Andrey пишет: цитата: | Подскажите алгоритм обхода папок - но только рекурсивно |
| Посмотри исходники в папке samples\Applications\ SafetyScan Andrey пишет: цитата: | Собрался по удалять "мусор" у себя на винте |
| Вышеуказанная программа предназначена именно для этой цели...
|
|
|
|
| постоянный участник
|
Пост N: 1140
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.10 13:07. Заголовок: Спасибо Григорий ! Я..
Спасибо Григорий ! Я долго искал такую простую программу... А тут еще и с исходником... Красота...
|
|
|
|
| постоянный участник
|
Пост N: 1141
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.10 13:20. Заголовок: Блин, облом... :sm3..
Блин, облом... Прога не ищет файлы с атрибутами: Только для чтения Архивный Скрытый Системный Мне нужно удалить файлы после Outpost'a: op_cache.atr и op_cache.idx ! В каждой папке оставил !!!
|
|
|
|
| постоянный участник
|
Пост N: 330
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.03.10 15:14. Заголовок: Команда DEL /S не по..
Команда DEL /S не подходит?
|
|
|
|
| постоянный участник
|
Пост N: 1142
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.10 18:52. Заголовок: PSP пишет: Команда..
PSP пишет: цитата: | Команда DEL /S не подходит? |
| Посыпаю голову пеплом.... Совсем не знал про ключ /S .... Придется как в том высказывание: Учите мат.часть Шура... Пошел учить.
|
|
|
|
| постоянный участник
|
Пост N: 1474
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.07.10 23:37. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Посмотри исходники в папке samples\Applications\SafetyScan |
| Посмотрел. Никак не могу переделать под себя. Требуется сделать ПОЛНЫЙ список файлов с путями ну допустим диска Д: Подскажите, как это (рекурсию) реализовать ?
|
|
|
|
| постоянный участник
|
Пост N: 1475
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.07.10 23:57. Заголовок: Нашел попроще: SAMP..
Нашел попроще: SAMPLES\BASIC\DirectoryRecurse Только никак не могу понять следующую конструкцию: if ProcName( 5 ) == "DIRECTORYRECURSE" return {} endif Подскажите что это такое ?
|
|
|
|
| |
Пост N: 154
Зарегистрирован: 12.11.06
|
|
Отправлено: 26.07.10 07:40. Заголовок: Доброе утро! Если по..
Доброе утро! Если поможет, то изврат на фоксе (код 100% подойдёт (там слабые возможности работы с каталогами)): * ------------------------------------------------------------------- * Удаление непустого каталога. Рекурсивно стираю все файлы с самого * нижнего уровня и удаляю каталоги от самого нижнего уровня. * Для реального удаления обращаюсь к подфункции 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
|
|
|
|
| постоянный участник
|
Пост N: 1477
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.10 09:42. Заголовок: 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
|
|
|
|
|
| |
Пост N: 34
Зарегистрирован: 11.06.10
|
|
Отправлено: 26.07.10 11:52. Заголовок: Andrey пишет: MiniG..
Andrey пишет: MiniGUI тут не поможет. Andrey пишет: цитата: | Если интересно вот пример: Скрытый текст |
| Это чистый код на Harbour, а MiniGUI - пользовательский графический интерфейс. Не нужно вводить других в заблуждение
|
|
|
|
| постоянный участник
|
Пост N: 1478
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.10 14:27. Заголовок: AlexMyr пишет: Это ..
AlexMyr пишет: цитата: | Это чистый код на Harbour, а MiniGUI - пользовательский графический интерфейс. |
| Я в том смысле, что в MiniGui - куча примеров !!! А в поставке Harbour их нет ! AlexMyr пишет: цитата: | Не нужно вводить других в заблуждение |
| Не буду !
|
|
|
|
|
| постоянный участник
|
Пост N: 1661
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.02.11 01:33. Заголовок: Кто нибудь может объ..
Кто нибудь может объяснить зачем в 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
|
|
|
|
|