Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > листинг файлов


Автор: Grom 5.12.2006, 01:39
как сделать листнг всех файлов и файлов в подпапках ?
нашёл только листнг файлов и папок, но переделать под себя никак не могу. Вот что сделал - вроде верно, но все равно делается только листинг файлов и папок.

Код

void pars (AnsiString a)
{
AnsiString  vasFilename,    //имя файла
            vasFileMask,    //маска файла
            vasCurDir;      //текущая директория
 //TSearchRec информация о файле
 TSearchRec tFileInfo;
 //Определяем каталог


 vasCurDir=a;

 //Если корневая директория  удаляем слэш
 if(vasCurDir.Length() == 3)
  vasCurDir=vasCurDir.Delete(3,1);
 //Задаем маску
 vasFileMask="*.*";
 //Определяем имя файла
 vasFilename=vasCurDir+"\\"+vasFileMask;
 //Сюда выведем список файлов
 //Form1->Memo1->Lines->Clear();
 if(FindFirst(vasFilename,faAnyFile,tFileInfo) == 0)
 {
  while(1)
  {
   //Исключаем корневую
   if((tFileInfo.Name != ".")&(tFileInfo.Name != ".."))

    //Фильтруем каталоги в Memo2 а файлы в Memo1
    if(tFileInfo.Size != 0 )
     Form1->Memo1->Lines->Add(tFileInfo.Name);
    else
    {
    Form1->Memo2->Clear();
     Form1->Memo2->Lines->Add(tFileInfo.Name);
     AnsiString str;
     int co;
   co=Form1->Memo2->Text.Length();

   str=Form1->Memo2->Text;
    str=str.SubString(0,co-2);
     ShowMessage(str);
     pars(str); //рекурсивный вызов функции

    }
   if(FindNext(tFileInfo) != 0)
    break;

  }
 }
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
char a[256];
GetWindowsDirectory(a,sizeof(a));
pars(a);
}


Вот там где рекурсивный вызов по моей идее как только нашлась папка в ней должна запуститься функция pars и потом вернуться на прошлую папку.. и тд.. но почему-то так не делается  smile 

Автор: codelord 5.12.2006, 05:56
Вот пример реализации Drag&Drop, там директория раскладывается до последнего файла:

Автор: Grom 5.12.2006, 18:37
codelord, спасибо большое... буду разбираться.

Автор: Akeem 5.12.2006, 22:25
Вот ещё реализация консольного приложения листинга файлов в директории.

Код


#include <fstream>
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <dir.h>
#include <dos.h>
#include <string>
 #include <algorithm>
 #include <functional>

using namespace std;

int main()
{

    ffblk MyStruct;
    char *DirName;
    string FileName;
    int done;
    cout<<"Enter directory "<<endl;
    cin>>DirName;
    printf("List directory %s\n",DirName);
    done = findfirst(DirName,&MyStruct,0);
    while (!done)
    {
        FileName = MyStruct.ff_name;
        
                    printf(" %s\n", FileName);

        done = findnext(&MyStruct);
    }
    getch();
    return 0;
}


Это как бы костяк. А ты уже думаю сам допишешь что куда надо.

Автор: Grom 6.12.2006, 22:38
codelord, блин не получается разобраться что-то... smile ничего не понятно.

Akeem, вообще с ошибкой.. не компилит.

Автор: Grom 6.12.2006, 23:51
вот нашёл такой пример, переписывал его с делфи, но 2 ошибки не могу исправить

Код

void GetAllFiles (AnsiString Path, TListBox Lb)
{
TSearchRec  sRec;
boolean  isFound;

   isFound = FindFirst( Path + "\*.*", faAnyFile, sRec ) == 0;
   while (isFound)
   {
      if ( (sRec.Name != "." ) && ( sRec.Name != "..") )
      {
         if (( sRec.Attr) && (faDirectory) == faDirectory)
            GetAllFiles( Path + "\\" + sRec.Name, Lb ); //первая ошибка
         Lb.Items->Add( Path + "\\" + sRec.Name );
      }
      //Application->ProcessMessages;
      isFound = FindNext( sRec ) == 0;
   }
   FindClose( sRec );
}


//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
GetAllFiles( "c:\\", ListBox1 ) ; //вторая
}


и там и там говори: VCL style classes must be constructed using operator new

как исправить - я так и не понял. помогите  smile 

Автор: codelord 7.12.2006, 00:37
Код

void GetAllFiles (AnsiString Path,TListBox *Lb)
{
TSearchRec  sRec;
boolean  isFound;

   isFound = FindFirst( Path + "\*.*", faAnyFile, sRec ) == 0;
   while (isFound)
   {
      if ( (sRec.Name != "." ) && ( sRec.Name != "..") )
      {
         if (( sRec.Attr) && (faDirectory) == faDirectory)
            GetAllFiles( Path + "\\" + sRec.Name, Lb ); //
         Lb->Items->Add( Path + "\\" + sRec.Name );
      }
      //Application->ProcessMessages;
      isFound = FindNext( sRec ) == 0;
   }
   FindClose( sRec );
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TListBox *ListBox1 = new TListBox(this);
  ListBox1->Parent=this;
  ListBox1->Top=0;
  ListBox1->Left=0;
  ListBox1->Height=300;
  ListBox1->Width=300;
  GetAllFiles( "c:\\", ListBox1 ) ; //
}

Автор: Grom 7.12.2006, 01:37
codelord, огромное спасибо! то что надо  smile 
а вот ещё там Application->ProcessMessages; 

я поставил там &Application->ProcessMessages; но программа всё равно подвисает если собирать листинг по папке с виндой. что можно придумать ?

Автор: codelord 7.12.2006, 05:40
так будет несколько шустрей
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TListBox *ListBox1 = new TListBox(this);
  ListBox1->Parent=this;
  ListBox1->Top=0;
  ListBox1->Left=0;
  ListBox1->Height=300;
  ListBox1->Width=300;
  ListBox1->Items->BeginUpdate();
  GetAllFiles( "c:\\windows\\", ListBox1 ) ; 
  ListBox1->Items->EndUpdate();
}


Добавлено @ 05:48 
Цитата(Grom @  6.12.2006,  21:37 Найти цитируемый пост)
я поставил там &Application->ProcessMessages;

поставь: 
Код

Application->ProcessMessages();

а то толку от такой записи нет smile

Автор: Grom 7.12.2006, 11:55
codelord, блин спасибо, не досмотрел. респект  smile 

Автор: Akeem 7.12.2006, 20:16
Grom, 
Не знаю почему у тебя выдает ошибку у меня работало и прекрасно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)