Toon posts:

[C++/unix] Hoe subdirs opvragen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dit zal wel een n00b vraag zijn en misschien gaan er wel mensen heel hard lachen, maar dat moet dan maar....

Ik ben bezig met een C++ programmaatje wat in een bepaalde directory moet kijken of er subdirectories zijn, en zo ja wat de namen van deze subdirs zijn. Onder windows heb ik dat al voor elkaar. Maar ik wil het ook onder unix kunnen compileren (met de gcc compiler, voor het geval dat dat wat uitmaakt...).

Hoe weet ik of een entry in een directory zelf weer een directory is? Als ik dit doe
code:
1
2
DIR* dirHandle = opendir("een_directory"); 
dirent* entry = readdir(dirHandle);

dan krijg ik een struct dirent terug. Daarin staat b.v. wel de naam van de entry, maar niks over het al of niet (sub)directory zijn. Hoe moet het wel?

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Volgens mij moet je hiervoor de functie "getdirentries" gebruiken, dan krijg een lijst met alle directories in een map. Volgens krijg je dan een struct terug (als het fout is krijg -1 terug) met type, en naam etc. Moet eerlijk bekennen dat ik niet zo 1-2-3 weet of dit samen gaat met je code hierboven.

Maar in Qt weet ik het wel :)

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// more information: Programming with Qt O Reilly. Chapter 11 (185-195)
#include <qapplication.h>
#include <qdir.h>
#include <qfileinfo.h>

void getFileInfoByPath ( const char* path ) {
//
QDir dir( path );
dir.setFilter( QDir::Dirs | QDir::NoSymLinks );

// initialization of the structs etc.
const QFileInfoList* t_fileinfo = dir.entryInfoList();
QFileInfoListIterator it( *t_fileinfo );
QFileInfo* file_info;

// iterate to the list and print it to stdout
while ( ( file_info = it.current() ) ) {
   // looks like stuff in windows ;)
    if ( it->isDir() &&  it->isReadable() ) {
            // iterate subdirectory ;)
            getFileInfoByPath( it->absFilePath() );
    } else {
        writeln( " --> file path: %s\n", it->absFilePath() );
    }
    ++t_fileinfo;
}
}


int main() {
   getFileInfoByPath( "/home/alienfruit" );
}

[ Voor 87% gewijzigd door alienfruit op 09-07-2003 22:21 ]


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Je kunt met stat(2) en de macro S_ISDIR() erachter komen of een bestand een dir is.

Dus voor elke entry in een dir moet je kijken of het directory is (en dus een subdir van je startdir).

[ Voor 3% gewijzigd door _Squatt_ op 10-07-2003 13:56 . Reden: de macro is S_ISDIR(), niet ISDIR() ]

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
_Squatt_ schreef op 09 July 2003 @ 22:29:
Je kunt met stat(2) en de macro ISDIR() erachter komen of een bestand een dir is.

Dus voor elke entry in een dir moet je kijken of het directory is (en dus een subdir van je startdir).
Bedankt, _Squatt_! Ik heb wat info opgezocht en ik denk dat ik door heb hoe het moet (of liever: kan).

Alienfruit, ik heb ook een beschrijving van getdirentries() opgezocht, maar ik ben er niet zeker van dat ik helemaal snap hoe dat in elkaar steekt. Dus ga ik maar voor _Squatt_'s oplossing. Maar jouw Qt suggestie is in de toekomst misschien nog handig, want er is een kans dat ik Qt kan gaan gebruiken op zowel windows als unix. En als dat het geval is kan ik de code platform-onafhankelijk maken, want volgens mij is de afhankelijkheid dan verborgen in Qt...

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

_Squatt_ hey! Dat wist ik nog niet!
Overigens raccoon, Qt is platform onafhankelijk wat je maakt onder Linux heeft een zéér grote kans dat het ook werkt onder Windows.

Verwijderd

Topicstarter
alienfruit schreef op 10 July 2003 @ 09:31:
Overigens raccoon, Qt is platform onafhankelijk wat je maakt onder Linux heeft een zéér grote kans dat het ook werkt onder Windows.
Weet ik. (Dat zei ik toch ook al?)

Verwijderd

Als het zowel onder windows als unix moet werken, is het missschien de moeite waard om op http://www.boost.org naar de filesystem library te kijken.

Verwijderd

Topicstarter
Verwijderd schreef op 10 July 2003 @ 09:49:
Als het zowel onder windows als unix moet werken, is het missschien de moeite waard om op http://www.boost.org naar de filesystem library te kijken.
Hey, dat Boost kende ik nog niet... Bedankt freefly!

Heb meteen effe gekeken, en weet je wat nou het grappige is? De implementatie in Boost onder windows komt ruwweg overeen met wat ik zelf al had, en onder POSIX met wat _Squatt_ suggereerde... :)

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Tja. Het was nog vroeg he :Z
Ach zo lang het maar werkt ;)

Verwijderd

Topicstarter
alienfruit schreef op 10 juli 2003 @ 12:17:
Ach zo lang het maar werkt ;)
En dat doet het inmiddels :)
Bedankt mensen! _/-\o_
Pagina: 1