Дерево каталогов
От: DLP Россия http://www.fsb.ru
Дата: 15.10.02 12:54
Оценка:
Как в Delphi 6 реализовать просмотр вложенных каталогов?
Например: задаётся стартовые каталог C:\TEMP
Требуется получить список файлов из всех вложенных каталогов, включая текущий.

thx
Поможите, люди добрые...... сами мы не местные....
Re: Дерево каталогов
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 15.10.02 12:59
Оценка:
Здравствуйте DLP, Вы писали:

DLP>Как в Delphi 6 реализовать просмотр вложенных каталогов?

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

DLP> thx


Этот вопрос уже неоднократно обсуждался... Поиском не пробовали воспользоваться?

А по сути вопроса — рекурсией. Вызвать функцию, передав ей в качестве параметра имя стартового каталога. Если элемент, содержащийся в каталоге — тоже каталог, то вызвать функцию для этого каталога...

Функции в Delphi для этого дела — FindFirst, FindNext, FindClose. Делаете для них wrapper (ту самую функцию, что я упоминал выше, и вперед). Подробности — в справке по Дельфи.
Re[2]: Дерево каталогов
От: Аноним  
Дата: 15.10.02 14:53
Оценка:
хым... а действительно: КАК ?
Re: Дерево каталогов
От: DYM Россия  
Дата: 15.10.02 15:52
Оценка:
Здравствуйте 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:\\"); //этот вызов нарисует всю структуру диска С:
}



Это куски из работающих программ.

Всем удачи...
Счастье — это Glück!
Re[3]: Дерево каталогов
От: Lloyd Россия  
Дата: 15.10.02 16:06
Оценка:
Здравствуйте Аноним, Вы писали:

А>хым... а действительно: КАК ?


dir *.* /S

и парсить, парсить, парсить
Re: Дерево каталогов
От: Vit! США www.nevzorov.net
Дата: 15.10.02 16:40
Оценка:
http://www.forum.vingrad.ru/cgi-bin/newforum/ikonboard.cgi?s=3dacadf312caffff;act=ST;f=32;t=858;hl=%EA%E0%F2%E0%EB
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.