[ w3bl0rd @ 10.05.2006. 19:53 ] @
dakle trebao bih u f-ju koja bi mi vratila imena fajlova...
riječ je o borland c++ builderu 6
trebam sva imena fajlova iz jednog foldera postaviti u combobox... bez extenzije...
hvala...
ovo ništa mi nije problem jer znam kako no problem mi je ovo kako da dobijem van imena fajlova hvala...
[ X Files @ 10.05.2006. 20:25 ] @
Ne kapiram sta ne znas? Kako se dobija naziv fajla bez ekstenzije?

Ako je to, onda mozes sam da napravis neku funkciju, jer nista slicno nema u VCL.

Na primer:

Code:

AnsiString ExtractFileNameWithoutExtension( AnsiString FILE )
{
   return ( ExtractFileName ( ChangeFileExt( FILE, "" ) ) );
}


ili

Code:

AnsiString ExtractFileNameWithoutExtension( AnsiString FILE )
{
   AnsiString FNM = ExtractFileName( FILE );
   AnsiString EXT = ExtractFileExt ( FNM );
   FNM.SetLength( FNM.Length() - EXT.Length() );
   return ( FNM );
}
// ili u jednoj liniji, to isto:
AnsiString ExtractFileNameWithoutExtension( AnsiString FILE )
{
   return ( ExtractFileName( FILE ).SetLength( ExtractFileName( FILE ).Length() - ExtractFileExt( FILE ).Length() ) );
}


pa sve to (tj izaberi samo jednu funkciju koja ti se vise svidja) mozes da strpas u kod
(ComboBox1 ce hvatati foldere, a ComboBox2 ce hvatati fajlove i to bez ekstenzije):

Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   ComboBox1->Items->Clear();
   ComboBox2->Items->Clear();

   TSearchRec sr;
   if ( FindFirst( "C:\\*.*", faAnyFile, sr ) == 0 )
   {
      do
      {
         if ( ( sr.Attr & faDirectory ) > 0 )
            ComboBox1->Items->Add( sr.Name );
          else
            ComboBox2->Items->Add( ExtractFileNameWithoutExtension( sr.Name ) );
      }
      while( FindNext( sr ) == 0 );

      FindClose( &sr );
   }

   if ( ComboBox1->Items->Count > 0 )
      ComboBox1->ItemIndex = 0;

   if ( ComboBox2->Items->Count > 0 )
      ComboBox2->ItemIndex = 0;

}



[Ovu poruku je menjao X Files dana 10.05.2006. u 21:26 GMT+1]

[Ovu poruku je menjao X Files dana 10.05.2006. u 21:47 GMT+1]
[ yooyo @ 11.05.2006. 08:58 ] @
Code:

bool FindFiles(const char* dir, const char* ext, std::vector<std::string>& ret)
{
    WIN32_FIND_DATA FileData; 
    HANDLE hSearch; 
    BOOL fFinished = FALSE; 

    ret.clear();

// pravi se string oblika "X:/path/*.ext"
    std::string target = dir;

    int l = (int)dir.size();
    if ((dir[l-1] != '\\') || (dir[l-1] != '/')) dir += '/';

    target = target + ext;

    hSearch = FindFirstFile(target.c_str(), &FileData); 
    if (hSearch == INVALID_HANDLE_VALUE) 
        return false;

    while (!fFinished) 
    { 
        if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            ret.push_back(FileData.cFileName);

        if (!FindNextFile(hSearch, &FileData))
            fFinished = TRUE; 
    } 

    FindClose(hSearch);

    return true;
}

Primer: 
std::vector<std::string> spisak;
FindFiles("c:/windows/system32","*.dll", spisak);
i ako je poziv uspeo... u spisak ces dobiti imena svih DLL fajlova


[ w3bl0rd @ 11.05.2006. 13:01 ] @
ma trebalo mi je samo FindNextFile samo to...
hvala...
[ k4rl0 @ 28.09.2006. 21:04 ] @
Krenuo sam ja malo WinAPI,pa sam naletio na ovaj primjer,ne znam zasto
ali mi ne radi ova linija koda:
Code:
int l = (int)dir.size();

A ne cudi me sto ne radi jel ipak dir je tipa char a ne string pa se sa njime
ne moze pozvat funkcija size(),zato sam ja napisao ovako:
Code:
#include <windows.h>
#include <vector>
#include <iostream>
#include <stdlib.h>
using namespace std;

bool FindFiles(const char* dir, const char* ext, vector<string>& ret)
{   WIN32_FIND_DATA FileData; 
    HANDLE hSearch; 
    BOOL fFinished = FALSE; 

    ret.clear();
    
   string target = dir;

    int l = target.size();
    if ((dir[l-1] != '\\') || (dir[l-1] != '/')) dir += '/';

    target = target + ext;

    hSearch = FindFirstFile(target.c_str(), &FileData); 
    if (hSearch == INVALID_HANDLE_VALUE) 
        return false;

    while (!fFinished) 
    { 
        if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {ret.push_back(FileData.cFileName);}

        if (!FindNextFile(hSearch, &FileData))
            fFinished = TRUE; 
    } 

    FindClose(hSearch);

    return true;
}


int main()
{
vector<string> spisak;
FindFiles("c:/windows/system32","*.dll", spisak);

for(int i=0;i<spisak.size();i++)
  cout<<"Spisak od"<<i<<"je"<<spisak[i]<<"\n";  
  
system("PAUSE");
}


Mislim da je sve ok,ali se nista ne ispisuje,stovise cini mi se da program
ne ulazu uopce u petlju kad je se pozove,ako neko zna sta je problem
neka pls kaze,hvala..
[ yooyo @ 29.09.2006. 22:00 ] @
Code:
    if ((dir[l-1] != '\\') || (dir[l-1] != '/')) dir += '/';

treba
Code:
    if ((target[l-1] != '\\') || (target[l-1] != '/')) target += '/';


btw.. prethodni primer sam kopirao iz mog code-a ali sam ga modifikovao dok sam pisao poruku i napravio gresku koju si ti primetio.
[ IDE @ 30.09.2006. 12:48 ] @
Za dobijanje imena fajlova uvijek mozes iskoristiti klasu TFileListBox, cini mi se da se tako zove.

napravi petlju koja ce ti prebaciti imena svih fajlova u ComboBox, pri cemu im mice ekstenziju...

Mislim... nije savrseno, ali radi svoj posao...