PDA

View Full Version : [ C/C++ ] aiuto


LimiT-MaTz
22-02-2005, 19:58
Dovrei creare un programma che esegua un controllo di tutte le directory del sistema e ne faccia un controllo sulla data e stampi le prime 5 (le + nuove).

Non saprei da dove iniziare.
Cosa mi servirebbe per fare il controllo e muovermi nelle directory?

Datemi un po di spunti e materiale su cui controllare.
Grazie.

kk3z
22-02-2005, 21:14
Usa FindFirstFile, FindNextFile, FindClose e la struttura WIN32_FIND_DATA (cerca su google)

esempio pratico:
std::vector<std::string>lastTimeVector;
std::vector<std::string>dirNameVector;

void SearchDirectory(LPCTSTR szDirectory)
{
std::string strDir = szDirectory + std::string("\\*.*");

WIN32_FIND_DATA data;
HANDLE hFile = FindFirstFile(strDir.c_str(), &data);
if (hFile == INVALID_HANDLE_VALUE)
return;

do
{
// se è una directory
if( (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
SYSTEMTIME st;
FileTimeToSystemTime(data.ftLastWriteTime , &st);

TCHAR szData[256];
// Formatto la data in questo modo: ora:minuti:secondi:millisecondi giorno numeroGiorno mese anno
wsprintf(szData, "%d:%d:%d:%d %d %d %d %d", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, st.wDay, st.wDayOfWeek, st.wMonth, st.wYear);

// inserisco nei due vettori
lastTimeVector.push_back(std::string(szData));
dirNameVector.push_back( std::string(szDirectory + "\\" + data.cFileName));

// cerco nella directory per le subdirectory
SearchDirectory(std::string(strDirectory + "\\" + data.cFileName));
}
}while(FindNextFile(hFile, &data));

//chiudo l'handle
FindClose(hFile);
}


Ti ho postato semplicemente il codice per cercare le directory.
Non so se è il metodo più giusto usare due vettori distinti per il nome e per la data, dovresti mettere in ordine il vettore delle data (usa std::sort) e far corrispondere alla data il nome della directory, e quindi scrivere a schermo le prime cinque.
Cmq l'ho scritto adesso, nn ho provato a compilarlo ma dovrebbe andare :) ciao

LimiT-MaTz
22-02-2005, 21:32
Originariamente inviato da kk3z
Usa FindFirstFile, FindNextFile, FindClose e la struttura WIN32_FIND_DATA (cerca su google)

esempio pratico:
std::vector<std::string>lastTimeVector;
std::vector<std::string>dirNameVector;

void SearchDirectory(LPCTSTR szDirectory)
{
std::string strDir = szDirectory + std::string("\\*.*");

WIN32_FIND_DATA data;
HANDLE hFile = FindFirstFile(strDir.c_str(), &data);
if (hFile == INVALID_HANDLE_VALUE)
return;

do
{
// se è una directory
if( (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
SYSTEMTIME st;
FileTimeToSystemTime(data.ftLastWriteTime , &st);

TCHAR szData[256];
// Formatto la data in questo modo: ora:minuti:secondi:millisecondi giorno numeroGiorno mese anno
wsprintf(szData, "%d:%d:%d:%d %d %d %d %d", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, st.wDay, st.wDayOfWeek, st.wMonth, st.wYear);

// inserisco nei due vettori
lastTimeVector.push_back(std::string(szData));
dirNameVector.push_back( std::string(szDirectory + "\\" + data.cFileName));

// cerco nella directory per le subdirectory
SearchDirectory(std::string(strDirectory + "\\" + data.cFileName));
}
}while(FindNextFile(hFile, &data));

//chiudo l'handle
FindClose(hFile);
}


Ti ho postato semplicemente il codice per cercare le directory.
Non so se è il metodo più giusto usare due vettori distinti per il nome e per la data, dovresti mettere in ordine il vettore delle data (usa std::sort) e far corrispondere alla data il nome della directory, e quindi scrivere a schermo le prime cinque.
Cmq l'ho scritto adesso, nn ho provato a compilarlo ma dovrebbe andare :) ciao

Grazie gentilissimo.
Pero' mi sembra una sorta di arabo.
Io faccio programmazione in università (ing. inf.) e per ora ho fatto il 1 esame ma riguardava programmazione in C (senza l'uso di classi).
Cmq me lo salvo e cerco di capire un attimo come funziona anche se cosi' non mi e' per nulla chiaro.

tglman
22-02-2005, 22:17
Il codice sopra è molto visual c in c standard ci sono anche le finzioni findfirst e findnext ma non ti conviene usarle,
e comunque condivido anch'io il codice scritto sopra è il modo migliore per le ricerce delle specifiche delle funzioni ti consigli di affinacare al nome della funzione msdn (è il sito migliore per le funzioni win).

Anch'io studio ing. inf, ma lavoro anche quindi mi sono un pò perso

Ciao !!

kk3z
23-02-2005, 11:07
Ti spiego in poche parole cosa fa:
FindFirstFile apre un'handle a un file o a una directory: un handle è una specie di puntatore al file (più o meno come FILE). In windows è tutto basato sugli handle: ci sono gli HWND (Handle a WiNDow) HFONT HBITMAP HICON HMENU e chi più ne ha ne metta. Dopo aver aperto questo handle controllo che punti effettivamente a qualcosa, nel caso contrario la funzione ritorna. Poi entro in un ciclo do/while che non termina fino a quando FindNextFile trova ancora file o directory (cioè fino a quando l'handle al file non punta a nulla). In più, ogni ciclo questa funzione mi riempie di dati una struttura (cioè WIN32_FIND_DATA) riguardo l'oggetto che sto analizzando in quel ciclo. Dopo aver controllato che sia effettivamente una directory (in questo caso il membro dwFileAttributes della struttura "data" è FILE_ATTRIBUTE_DIRECTORY) , grazie alla funzione FileTimeToSystemTime trasformo data.ftLastWriteTime (che è una struttura FILETIME ) in una struttura SYSTEMTIME, che mi permette di distinguere tra ora data minuti ecc. Quindi grazie a wsprintf trasformo in una stringa di caratteri tutti quei numeri, in modo che possa confrontarli con i numeri degli altri file (es ora di adesso 12(ora):15(minuti):40(secondi):10(millisecondi) 23 3(mercoledi) 2(febbraio) 2005). Inserisco alla fine dei due vettori (grazie a push_back) la stringa che ho appena generato e il nome della directory, e infine cerco (chiamo la stessa funzione SearchDirectory) in questa cartella che ho appena controllato.

Ti chiarisco un po' le idee anche sugli identificatori: LPCTSTR è un puntatore (LPCTSTR) a una stringa, che in questo caso è costante (LPCTSTR). Quindi è uguale a un tipo "const TCHAR*".
std::string e std::vector fanno parte della standard template library (STL), e si possono usare solo con il c++. std::string è una stringa in stile c++, è molto comoda da usare perchè si possono usare addizioni (std::string strDir = szDirectory + std::string("\\*.*") per esempio) e uguaglianze come per i numeri, molto più comodo che usare strcat o strcmp e gli array stile c ;) std::vector è invece una specie di array dinamico, in questo caso di stringhe.

Ti ho chiarito le idee? :)