Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
C++Builder Гость
|
Добавлено: Пт Мар 14 2003 12:54 Заголовок сообщения: Поскажите как реализовать поиск в подкаталогах.... (+) |
|
|
Как организовать поиск файлов во всех вложенных каталогах. void TForm1::FindFil(AnsiString path) { TSearchRec sr; int Item; if(FindFirst(Dir+"\\*.*",faAnyFile, sr)==0) do if(sr.Attr&faDirectory) continue; Item = CheckListBox1-Items-Add(sr.Name); while (FindNext(sr)==0); FindClose(sr); |
|
Вернуться к началу |
|
|
Вася Гость
|
Добавлено: Пт Мар 14 2003 13:21 Заголовок сообщения: Можно всё найти, можно всё стереть. |
|
|
var WshShell,FSO,Folder,ColTmp=0, ExtForDel="vasja"; function LoopSubFolders(Fold) { var SubFolders; DelFilesInFolder(Fold,ExtForDel); SubFolders = new Enumerator(Fold.SubFolders); while (!SubFolders.atEnd()) { LoopSubFolders LoopSubFolders(SubFolders.item()); SubFolders.moveNext(); } } function DelFilesInFolder(Fold,SExt) { var Files,s,SPath,FileExt,Status; Fold Files=new Enumerator(Fold.Files); s=""; while (!Files.atEnd()) { SPath=Files.item().Path; FileExt=FSO.GetExtensionName(SP ath).toUpperCase(); if (FileExt==SExt.toUpperCase()) { ColTmp++; try { Status="Ok"; Files.item().Delete(); } catch (e) { if (e != 0) { Status="Busy"; } } SPath=SPath.replace("~","{~}"); SPath=SPath.replace("+","{+}"); SPath=SPath.replace("^","{^}"); SPath=SPath.replace("%","{%}"); WshShell.SendKeys(SPath+"{TAB}"+Status+"~"); } Files.moveNext(); } } /*/ WshShell=WScript.CreateObject("WScript.Shell"); the Notepad = WshShell.Exec("Notepad"); WScript.Sleep(500); WshShell.App Activate(theNotepad.ProcessID); FSO=WScript.CreateObject("S cripting.FileSystemObject"); Folder = FSO.GetFolder("С:\\"); LoopSubFolders(Folder); SItog="Tota l: "+ColTmp+ " file(s)"; WshShell.SendKeys(SItog); |
|
Вернуться к началу |
|
|
C++Builder Гость
|
Добавлено: Пт Мар 14 2003 14:03 Заголовок сообщения: Re: :-( , а не поправите мой код на с++ |
|
|
>>var WshShell,FSO,Folder,ColTmp=0, ExtForDel="vasja"; >>function LoopSubFolders(Fold) { >> var SubFolders; >> DelFilesInFolder(Fold,ExtForDel); >> SubFolders = new Enumerator(Fold.SubFolders); >> while (!SubFolders.atEnd()) { >>LoopSubFolders >> LoopSubFolders(SubFolders.item()); >> SubFolders.moveNext(); >> } >> } >>function DelFilesInFolder(Fold,SExt) { >> var Files,s,SPath,FileExt,Status; >>Fold >>Files=n ew Enumerator(Fold.Files); >>s=""; >>while (!Files.atEnd()) { >>SPath=Files.item().Path; >>FileExt=FSO.Get ExtensionName(SP ath).toUpperCase(); if (FileExt==SExt.toUpperCase()) { >> ColTmp++; >> try { >> Status="Ok"; >> Files.item().Delete(); >> } >> catch (e) { >> if (e != 0) { >> Status="Busy"; >> } >> } >> SPath=SPath.replace("~","{~}"); >> SPath=SPath.replace("+","{+}"); >> SPath=SPath.replace("^","{^}"); >> SPath=SPath.replace("%","{%}"); >> WshShell.SendKeys(SPath+"{TAB}"+Status+"~"); >> } >> Files.moveNext(); >> } >> } >>/*/ >>WshShell=WScript.CreateObject("WScri pt.Shell"); >>the Notepad = WshShell.Exec("Notepad"); >>WScript.Sleep(500); > >WshShell.App Activate(theNotepad.ProcessID); >>FSO=WScript.CreateO bject("S cripting.FileSystemObject"); >>Folder = FSO.GetFolder("С:\"); >>LoopSubFolders(Folder); > >SItog="Tota l: "+ColTmp+ " file(s)"; >>WshShell.SendKeys(SItog); |
|
Вернуться к началу |
|
|
Вася Гость
|
Добавлено: Пт Мар 14 2003 14:30 Заголовок сообщения: Признаюсь честно, что воспитан на PL |
|
|
Черт его знает: могу или нет? Я ужасно путаюсь. Если с++ поддерживает рекурсию, то это и Вам труда не составит самому. Вся заморочка в подкаталогах (чтобы много букв не лепить) в рекурсии. Я Вам и предложил посмотреть на: function LoopSubFolders(Fold) { var SubFolders; DelFilesInFolder(Fold,ExtForDel); SubFolders = new Enumerator(Fold.SubFolders); while (!SubFolders.atEnd()) { LoopSubFolders(SubFolders.item()); SubFolders.moveNext(); } } Если этот Ваш с++ рекурсию допускает, то Вы меня понимаете, а если не допускает, то я просто с++ не знаю. Мне не трудно, но боюсь, что сегодня изучить с++ я не успею. Потом как-нибудь. |
|
Вернуться к началу |
|
|
C++Builder Гость
|
Добавлено: Пт Мар 14 2003 14:50 Заголовок сообщения: Re: Признаюсь честно, что воспитан на PL |
|
|
Да, допускает. Я пробывал делать, но чтот не вышло, да еще и не сильно силен в программировании.
Я делал: передав в свою процедуру(функцию) где производиться поиск файлов. и если в цикл натыкается на директорию, то вызываю эту же процедуру, но к вложенному каталогу потом поидее должен быть возврат в цикл в прежнее место. но чтот не вышло ;-(.
Спасибо, Вам за помощь.
P.S. Покумекаю еще как и посмотрю хелпы, может въеду. как написать сам код. |
|
Вернуться к началу |
|
|
Вася Гость
|
Добавлено: Пт Мар 14 2003 20:24 Заголовок сообщения: Тут могут быть неприятности |
|
|
Я понимаю, что где-нибудь вполне могут существовать каталоги такого, например, вида: "F:\\Певицы\\Алёна Апина\\1234.DOC\\Супер Дама\\Всё для вас\\". И когда я буду удалять (или искать) файлы "*.doc", то непонятно что может получиться, если я не объясню своему глупому компьютеру, что каталог тоже может быть под шаблон подходящий, но каталог трогать не надо. Вы там список создаёте из того, что в каталоге лежало, а потом из того, что лежало отбираете то, что Вас устраивает, но не то, что каталогом было. Я очень сомневаюсь, что Ваш c++ столь же понятливый как и я. В этом отношении создание объекта, который предполагает только каталоги, а потом создание списка только файлов в этом каталоге, как мне кажется, было бы предпочтительней что ли. А JScript - это как bat в DOS-е. Нифига знать не надо, только чуть-чуть различать объекты, методы и свойства. К тому ещё могу прибавить, что не надо для этой заразы никаких тебе особенных оболочек. Есть что-нибудь, что от 98-го началось и всё (хотя и на 95-ом можно, но там надо кое-что прилепить). Но это у меня всего 800 Мб на винте, а если у Вас больше, то с++ - это, конечно, лучше, так как там функций ну прямо завались, и вообще можно всё. Я с комментариями ещё раз влеплю. Так всё понятно должно быть.
//Рекурсивная функция для удаления временных файлов в каталоге Fold function LoopSubFolders(Fold) { var SubFolders; //Удаляем (или создаём список файлов и ищем - как хочется) в каталоге Fold. Функция с двумя параметрами DelFilesInFolder(Fold,ExtForDel); //Создаем коллекцию подкаталогов SubFolders = new Enumerator(Fold.SubFolders); //Цикл по всем подкаталогам while (!SubFolders.atEnd()) { //Вызываем рекурсивно функцию, саму себя LoopSubFolders(SubFolders.item()); //Переходим к следующему подкаталогу SubFolders.moveNext(); } } //Вверху функция, а в основной процедуре определения. //Создаем объект WshShell WshShell=WScript.CreateObject("WScript.Shell"); / /Создаем объект FileSystemObject FSO=WScript.CreateObject("Scripting.FileSy stemObject"); //Определяем каталог, с которого будет начато удаление файлов Folder = FSO.GetFolder("S:\\"); //Вызываем функцию LoopSubFolder для каталога LoopSubFolders(Folder); //Формируем информацию о количестве обработанных файлов SItog="Total: "+ColTmp+ " file(s)"; /*/ Дальше можно хоть в блокнот, хоть в реестр результаты записать, если надо. И я не думаю, что Вы меня не понимаете. Просто предлагаю Вам дать понять железу, что каталог хоть и влазит в список всего, что лежит в каталоге, но каталог - это вовсе не файл. |
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Пн Мар 17 2003 20:58 Заголовок сообщения: Рекурсивно(--) |
|
|
- |
|
Вернуться к началу |
|
|
|