Как в Delphi 6 реализовать просмотр вложенных каталогов?
Например: задаётся стартовые каталог C:\TEMP
Требуется получить список файлов из всех вложенных каталогов, включая текущий.

thx
Поможите, люди добрые...... сами мы не местные....
Здравствуйте DLP, Вы писали:
DLP>Как в Delphi 6 реализовать просмотр вложенных каталогов?
DLP>Например: задаётся стартовые каталог C:\TEMP
DLP>Требуется получить список файлов из всех вложенных каталогов, включая текущий.
DLP>
thx
Этот вопрос уже неоднократно обсуждался... Поиском не пробовали воспользоваться?
А по сути вопроса — рекурсией. Вызвать функцию, передав ей в качестве параметра имя стартового каталога. Если элемент, содержащийся в каталоге — тоже каталог, то вызвать функцию для этого каталога...
Функции в Delphi для этого дела — FindFirst, FindNext, FindClose. Делаете для них wrapper (ту самую функцию, что я упоминал выше, и вперед). Подробности — в справке по Дельфи.
хым... а действительно: КАК ?
Здравствуйте DLP, Вы писали:
DLP>Как в Delphi 6 реализовать просмотр вложенных каталогов?
DLP>Например: задаётся стартовые каталог C:\TEMP
DLP>Требуется получить список файлов из всех вложенных каталогов, включая текущий.
Мой вариант для CBuilder'a, но я думаю после некоторой доработки запашет и на Delphi
Мой способ, которым я пользуюсь со времен компилятора Borland C++ 5.
Сначала объявим класс опроса каталога (позаимствован из
книги П.Киммела "Borland C++ 5").
//Текст заголовочного файла "_scanfolder.h"
#ifndef scanfolderH
#define scanfolderH
#include <dir.h>
//---------------------------------------------------------------------------
class CScanFolder : public ffblk
{
private: // User declarations
int Find;
public:
__fastcall CScanFolder(const char *FileName="*.*",int Attr = 0){
Find=findfirst(FileName, this, Attr);
}
operator const char*(){
return Find ? 0: ff_name;
}
int operator++(int){
return(Find=findnext(this));
}
int operator++(){
return operator++(0);
}
__fastcall ~CScanFolder(void){
findclose(this);
};
};
#endif
Параметр iAttr определяет атрибуты файла
(см. Help про структуру ffblk).
Пользоваться этим классом очень просто:
#include "_scanfolder.h"
//Например, вы хотите опросить текущий
//каталог и считать имена всех файлов с расширением
//*.cpp в ListBox1.
void __fastcall TfrmMain::Button1Click(TObject *)
{
AnsiString Mask = "*.cpp";
for(CScanFolder SF((char*)Mask.c_str(), 0);SF;SF++)
ListBox1->Items->Add(AnsiString(SF));
}
Теперь перейдем к построению дерева папок.
Для начала нам потребуется функция IsFolder
bool IsFolder(const AnsiString Folder)
{
if(::GetFileAttributes((char*)Folder.c_str())==DWORD(-1)){
MessageBox(NULL, "Папка не существует", "Внимание", MB_OK|MB_ICONEXCLAMATION );
return false;
}
if(::GetFileAttributes((char*)Folder.c_str()) & FILE_ATTRIBUTE_DIRECTORY)return true;
else return false;
}
//главную форму приложения назовем frmMain
//положим на нее компонент TTreeView
//положим на нее компонент TImageList, в который засунем иконки
//папок - открытой и закрытой.
//объявляем метод BuildTree(TTreeView *Tree, TTreeNode * Node, const AnsiString Path)
//первый парметр это то дерево в котором мы хотим отобразить структуру папок
//второй - узел дерева к которому мы будем пристраивить свой куст
//третий - абсолютный путь к папки, структуру котрой мы хотим отобразить.
int __fastcall TfrmMain::BuildTree(TTreeView *Tree, TTreeNode * Node, const AnsiString Path)
{
AnsiString Mask = Path + slash +"*.*";
AnsiString Ext;
Tree->Items->BeginUpdate();
TTreeNode *sNode;
for(CScanFolder SF((char*)Mask.c_str(), FA_DIREC);SF;SF++){
if(AnsiString(SF)!="."&&AnsiString(SF)!=".."){
if(IsFolder(Path + AnsiString(SF))){
sNode = Tree->Items->AddChild(Node, SnipExt(AnsiString(SF)));
sNode->ImageIndex = 0;
sNode->SelectedIndex = 1;
}
if(IsFolder(Path + AnsiString(SF)))
BuildTree(Tree, sNode, Path + AnsiString(SF)+"\\");
}
}
Tree->Items->EndUpdate();
return 1;
}
//---------------------------------------------------------------------------
А дальше нам остается только вызвать этот метод.
void __fastcall TfrmMain::Button1Click(TObject *)
{
BuildTree(TreeView1, NULL, "C:\\"); //этот вызов нарисует всю структуру диска С:
}
Это куски из работающих программ.
Всем удачи...