14. oktober 2002 - 04:22Der er
19 kommentarer og 2 løsninger
filnavn til txt fil
Jeg arbejder i C++ Builder
Jeg vil gerne lave et lille program, der kan indlæse navnet på alle filer i en mappe. Programmet skal fungere således:
Læser navn på fil Skriver navn på fil ind i en textbox Fortsætter til næste fil i mappen Når der ikke er flere filer i mappen stopper den med at indlæse.
Har ingen ide om, det er en nem eller svær opgave, derfor er pointe sat lidt højt
Den traverserer en mappe for filnavne (af typer der ikke er filtreret fra)og putter dem i ResultVector.
Fx.: vector<string> ResVec; FILE_FILTER_T Filter; memset(Filter, 0, sizeof(FILE_FILTER_T)); SearchDir("C:/WINNT/System", "*.dll", &ResVec, Filter); // Her indeholder ResVec navne på ALLE .dll-filer i mappen C:/WINNT/System
// Du kan så gennemgå vectoren og add'e navnene til din listbox
OnClick() { vector<string> ResVec; SearchDir("C:/WINNT/System", "*.dll", &ResVec, NULL); // Her kan du gennemløbe ResVec (vectoren) og putte alle navne i din listbox }
vector er en datatype i STL (Standard Template Library) som følger med enhver C++ implementation. En vector kan bruges ligesom et array, du behøver bare ikke at allokere et bestemt antal pladser - den udvidder sig jo mere du fylder i (dynamisk allokering). Når du instantierer en vector, skal du fortælle den hvilken type elementer den skal holde, fx. int, char*, string ell. lign. (i dette tilfælde string).
Du itererer igennem en vector ved hjælp af en anden datatype der hedder en iterator:
vector<string> vec; // en vector, der tager string som datatype vector<string>::iterator itr; // en iterator, der kan bruges på en string-vector
itr = vec.begin(); // Nu peger iteratoren på det første element i vectoren. while(itr != vec.end()) // så længe vi ikke er nået til det sidste element { cout << (*itr); // skriv elementet ud itr++; // gå til næste element }
Når du skal konvertere string (som også er en STL datatype) til AnsiString, skal du først lave string om til char*. Dette gøres ved at bruge metoden c_str(). Dernæst er der en funktion i Builder der hedder AnsiString, og den laver char* strenge om til AnsiString:
string str = "Hello"; AnsiString astr; astr = AnsiString(str.c_str()); // her er den konverteret
Har ikke builder installeret, men dette her burde virke:
AnsiString astr; while(itr != vec.end()) // så længe vi ikke er nået til det sidste element { astr = AnsiString((*itr).c_str()); Memo1->Lines->Add(astr); itr++; // gå til næste element }
Hmm ja det virker, men der er stadig en del problemer.... Jeg tror problemet ligger i den stump kode her: int SearchDir(char* szDir, char* szText, vector<string> *ResultVector, FILE_FILTER_T* Filter) { int iCount = 0; struct _finddata_t file; long handle; string Temp; char szSearchText[MAX_PATH]; char szSearchDir[MAX_PATH]; bool fMatch; osv...
vector<string> vec; // en vector, der tager string som datatype vector<string>::iterator itr; // en iterator, der kan bruges på en string-vector itr = vec.begin(); // Nu peger iteratoren på det første element i vectoren. while(itr != vec.end()) // så længe vi ikke er nået til det sidste element { Memo1->Lines->Add(AnsiString((*itr).c_str())); itr++; // gå til næste element } int SearchDir(char* szDir, char* szText, vector<string> *ResultVector, FILE_FILTER_T* Filter) { int iCount = 0; struct _finddata_t file; long handle; string Temp; char szSearchText[MAX_PATH]; char szSearchDir[MAX_PATH]; bool fMatch; strcpy(szSearchDir, szDir); if (szSearchDir[strlen(szSearchDir) - 1] != '\\' && szSearchDir[strlen(szSearchDir) - 1] != '/') { strcat(szSearchDir, "/"); } strcpy(szSearchText, szSearchDir); strcat(szSearchText, szText); handle = _findfirst(szSearchText, &file); if (handle != -1) { do { fMatch = true; if (Filter != NULL) { if (Filter->fArchive && (file.attrib & _A_ARCH)) fMatch = false; if (Filter->fHidden && (file.attrib & _A_HIDDEN)) fMatch = false; if (Filter->fNormal && (file.attrib & _A_NORMAL)) fMatch = false; if (Filter->fReadOnly && (file.attrib & _A_RDONLY)) fMatch = false; if (Filter->fSubDir && (file.attrib & _A_SUBDIR)) fMatch = false; if (Filter->fSystem && (file.attrib & _A_SYSTEM)) fMatch = false; } if (fMatch) { Temp = szSearchDir; Temp += file.name; ResultVector->push_back(Temp); ++iCount; } } while (_findnext(handle, &file) == 0); } _findclose(handle); return iCount; } } //---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) { vector<string> ResVec; SearchDir("C:/WINNT/System", "*.dll", &ResVec, NULL); // Her kan du gennemløbe ResVec (vectoren) og putte alle navne i din listbox } //---------------------------------------------------------------------------
Drop en 'FileListBox' component fra 'Win 3.1' fanen - så får du med det samme en liste over alle filer i det pågældende directory. Du kan loade alle filerne over i en TMemo component vha.:
Heh, ja hvorfor lave det selv når det nu findes... :o) Tak for points
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.