Ahoj, chci udělat program co vypíše všechny soubory ve složce (C:\example),zjistí jejich název,velikost,celý patch. To není problém, umím takdy vypsat všechny složky z (C:\example), ale můj program neumí podsložky, což je pro mě nutné.
Pro naučení se výpisu souborů a složek jsem použil tento článek ( http://www.builder.cz/art/cpp/find_file.html ), bohužel se autor nezmínil o podsložkách.
Rád bych (pokud by to šlo) tak nějak zachoval syntaxi (postup, princip, funkce) toho článku. Jak na to ?
Fórum › C / C++
Strom složek
To Míra :
Přece v tom příkladu jakmile narazí na složku, tak ji vyřadí:
// Vyloučit složky
if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
No a ty ji nevyloučíš ale projdeš taky - nejlépe rekurzivně - jak narazíš na složku - zavoláš:
PridejZeSlozky(hListBox, &wfd);
Nezkoušel jsem (nedělám v C - ale tohle funguje už od DOSu), možná bude chtít poladit...
Funkci jsem upravil, tak aby nemazala obsah listboxu atd. ale vždy to zamrzne, vidím to na nekonečnou smyčku.
void PridejZeSlozky(HWND hWnd, LPTSTR lpSlozka, bool smazat)
{
TCHAR szSoubor[MAX_PATH];
StrCpy(szSoubor, lpSlozka);
StrCat(szSoubor, _T("\\*.*"));
HWND hListBox = GetDlgItem(hWnd, IDC_LISTBOX);
// Nejprve odstraníme případné staré položky ListBoxu
if (smazat == true)
SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
WIN32_FIND_DATA wfd;
ZeroMemory(&wfd, sizeof(wfd));
// Nalezneme 1. objekt
HANDLE hFind = FindFirstFile(szSoubor, &wfd);
if ( hFind == INVALID_HANDLE_VALUE )
return;
// Vyloučit složky
if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
PridejSoubor(hListBox, &wfd);
else
{
char buffer[5000];
sprintf(buffer, "%s\\%s", lpSlozka,PridejSlozku(hListBox, &wfd));
PridejZeSlozky(hWnd, buffer, false);
}
// Procházíme všemi objekty ve složce
while ( FindNextFile(hFind, &wfd) )
{
if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
PridejSoubor(hListBox, &wfd);
else
{
char buffer[5000];
sprintf(buffer, "%s\\%s", lpSlozka,PridejSlozku(hListBox, &wfd));
PridejZeSlozky(hWnd, buffer, false);
}
}
// Zavřít handle vyhledávání
FindClose(hFind);
}
// Funkce vracející název složky na kterou jsem narazil
LPTSTR PridejSlozku(HWND hListBox, LPWIN32_FIND_DATA lpWFD)
{
TCHAR szText[MAX_PATH+60];
TCHAR szVelikost[25];
TCHAR szCas[25];
FILETIME fileTime;
SYSTEMTIME sysTime;
StrCpy(szText, lpWFD->cFileName);
StrFormatByteSizeA(lpWFD->nFileSizeLow, szVelikost, sizeof(szVelikost));
FileTimeToLocalFileTime(&lpWFD->ftLastAccessTime, &fileTime);
FileTimeToSystemTime(&fileTime, &sysTime);
return szText;
}
To Míra :
Říkal jsem "možná bude chtít poladit...".
Šak se pořádně koukni, co dělá to PridejZeSlozky. Programování není slepení nějakých programů napsaných někým jiným, je třeba tomu trochu rozumět...
Správně by to mělo dostat název složky a specifikaci souborů a přidávat položky z té zadané složky do seznamu. Jenže u tebe to zkoumá jen tu konkrétní jednu složku, takže jak ju zavoláš rekurzivně, začne zase od začátku...
Takže uprav celou proceduru PridejZeSlozky tak, aby přidávala do seznamu z parametrem předané složky .
Třeba tohle v ní rozhodopádně nemože byt (to zařiď v nějaké hlavní proceduře, ze které teprve zavoláš PridejZeSlozky):
TCHAR szSoubor[MAX_PATH];
StrCpy(szSoubor, lpSlozka);
StrCat(szSoubor, _T("\\*.*"));
HWND hListBox = GetDlgItem(hWnd, IDC_LISTBOX);
// Nejprve odstraníme případné staré položky ListBoxu
if (smazat == true)
SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
WIN32_FIND_DATA wfd;
ZeroMemory(&wfd, sizeof(wfd));
:smile19: No, nějak jsem to nepochopil... funkci jsem upravil takhle:
char* JmenoSlozky(LPWIN32_FIND_DATA lpWFD)
{
char szText[MAX_PATH+60];
sprintf(szText, "%s", lpWFD->cFileName);
return szText;
}
void PridejZeSlozky(HWND hWnd, LPTSTR lpSlozka)
{
// Nalezneme 1. objekt
HANDLE hFind = FindFirstFile(szSoubor, &wfd);
if ( hFind == INVALID_HANDLE_VALUE )
return;
// Vyloučit složky
if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
PridejSoubor(&wfd);
else
{
sprintf(buf_temp, "%s%s",lpSlozka,JmenoSlozky(&wfd)); // Zjistím název složky na kterou jsem narazil
MessageBox(hWnd, buf_temp, NULL, 0); // Zobrazí se mi do MessageBoxu
PridejZeSlozky(hWnd,buf_temp); // Checkne to tu složku na kterou jsem narazil
}
// Procházíme všemi objekty ve složce
while ( FindNextFile(hFind, &wfd) )
{
if ( !(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
PridejSoubor(&wfd);
}
// Zavřít handle vyhledávání
FindClose(hFind);
}
Dál jsem se nedostal, fakt nevim :smile11: . Můžeš mi to přepsat ? Prosím
To nervak :
http://www.builder.cz/art/cpp/find_file.html?fshow=54701
Celkem to tak nějak chápu, ale nevím co po mě vlastně joDik chce.
JoDiK napsal:
To Míra :
Říkal jsem "možná bude chtít poladit...".
Šak se pořádně koukni, co dělá to PridejZeSlozky. Programování není slepení nějakých programů napsaných někým jiným, je třeba tomu trochu rozumět...
Správně by to mělo dostat název složky a specifikaci souborů a přidávat položky z té zadané složky do seznamu. Jenže u tebe to zkoumá jen tu konkrétní jednu složku, takže jak ju zavoláš rekurzivně, začne zase od začátku...
Takže uprav celou proceduru PridejZeSlozky tak, aby přidávala do seznamu z parametrem předané složky .
Třeba tohle v ní rozhodopádně nemože byt (to zařiď v nějaké hlavní proceduře, ze které teprve zavoláš PridejZeSlozky):
TCHAR szSoubor[MAX_PATH];
StrCpy(szSoubor, lpSlozka);
StrCat(szSoubor, _T("\*.*"));
HWND hListBox = GetDlgItem(hWnd, IDC_LISTBOX);
// Nejprve odstraníme případné staré položky ListBoxu
if (smazat == true)
SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
WIN32_FIND_DATA wfd;
ZeroMemory(&wfd, sizeof(wfd));
To nervak :
Já po tobě nic nechcu, teda kromě toho, abys to to nejdřív trochu prozkoumal. Já v C nedělám, jen jsem se pokusil tě nasměrovat. Dál už musíš sám, jak ti radí nervak - například to, že musíš ještě vyřadit z rekurze i položky . a .. (tečka představuje seznam položek složky a .. odkaz na nadřazenou složku. To bys procházel asi celý disk...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
2-3-4 strom v C — založil SpartakusCZ
Binární strom — založil garamond
Strom ze vstupu — založil Dave265
Moderátoři diskuze