Strom složek – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Strom složek – C / C++ – Fórum – Programujte.comStrom složek – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Míra
~ Anonymní uživatel
50 příspěvků
29. 3. 2011   #1
-
0
-

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 ?

Nahlásit jako SPAM
IP: 78.80.70.–
Reklama
Reklama
JoDiK
~ Anonymní uživatel
981 příspěvků
29. 3. 2011   #2
-
0
-

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...

Nahlásit jako SPAM
IP: 88.103.236.–
Míra
~ Anonymní uživatel
50 příspěvků
29. 3. 2011   #3
-
0
-

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;
}

Nahlásit jako SPAM
IP: 78.80.70.–
KIIV+42
God of flame
29. 3. 2011   #4
-
0
-

mozna je na case objevit kouzlo debug vypisu pred ruznejma akcema.. pripadne krokovani.. (ale to delej na mensich slozkach :D)


Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JoDiK
~ Anonymní uživatel
981 příspěvků
29. 3. 2011   #5
-
0
-

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));

Nahlásit jako SPAM
IP: 88.103.233.–
Míra
~ Anonymní uživatel
50 příspěvků
30. 3. 2011   #6
-
0
-

: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

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
30. 3. 2011   #7
-
0
-

FindFirst/NextFile vrací i "." a "..".

Evidentně nechápeš ani řádek toho kódu, takže ho nejdřív nastuduj a až pak upravuj.

Nahlásit jako SPAM
IP: 213.211.51.–
Míra
~ Anonymní uživatel
50 příspěvků
30. 3. 2011   #8
-
0
-

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));

Nahlásit jako SPAM
IP: 78.80.70.–
JoDiK
~ Anonymní uživatel
981 příspěvků
30. 3. 2011   #9
-
0
-

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...

Nahlásit jako SPAM
IP: 88.103.233.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 70 hostů

Podobná vlákna

B-strom — založil Siggi

2-3-4 strom v C — založil SpartakusCZ

Binární strom — založil garamond

Strom ze vstupu — založil Dave265

Binární strom — založil Tomáš

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý