PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c: verzeichnisse durchlaufen und best. dateien ausgeben?



Xerxes
16-12-2002, 21:23
Ich möchte ein kleines Konsolen-Programm (primär für Windows, aber unter Linux entwickelt ;) ) schreiben, dass alle ein verzeichnis und alle unterverzeischnisse durchläuft und alle gefundenen dateien eines typs (z.B. .mp3) ausgibt.
ein aufruf wäre dann z.B. "mp3_lister /music"
Die Ausgabe solle ungefähr in der Form stattfinden:
/music
/chills
lied1.mp3
lied2.mp3
/drum 'n' bass
nocheinlied.mp3

usw.

Wie finde ich raus, ob ein eintrag ein verzeichnis oder eine Datei ist? Hab irgendwo was dazu gefunden, aber das funktioniert nicht wirklich (und ich bin noch nicht wirklich erfahren in c....)
mein programm bis jetzt:

#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

//
// Uncomment the following line for Windows version
//
// #define WIN

//--------------------------------------------------------------------------

int main( int argc, char *argv[] )
{
DIR *dir;
struct dirent *dir_handle;
struct stat attribute;
char *search_dir = argv[1];
char *extension = ".mp3";
char *entry;

if( argc != 2 )
{
printf( "Falscher Programmaufruf!\n" );
printf( "Richtig: %s d:\\ c:\\Eigene Dateien\\\n", argv[0] );
}

if( !( dir = opendir( search_dir ) ) )
{
fprintf( stderr, "%s kann nicht geöffnent werden.\n", search_dir );
exit( 1 );
}
printf( "%s\n", search_dir );

while( dir_handle = readdir( dir ) )
{
entry = (*dir_handle).d_name;
stat( entry, &attribute );
if( attribute.st_mode & S_IFDIR )
{
printf( "\t/%s\n", entry );
}

if( strstr( entry, extension ) )
{
printf( "\t%s\n", (*dir_handle).d_name );
}
}

closedir( dir );

return 0;
}

nobody0
16-12-2002, 23:17
Im ANSI-Standard findet man nichts dafür, so dass man beim Compiler nachsehen muss, welche Funktionen er dafür bietet. Alternativ kann man über die Shell arbeiten.

capchaos
17-12-2002, 11:31
Schau dir mal die in <sys/stat.h> definierten Makros S_ISREG() und S_ISDIR() an.

_Wesentlich_ einfacher waer es mit /usr/bin/file und einem shell script zu machen.

pik7
17-12-2002, 11:42
hallo,


if( argc != 2 )

{

printf( "Falscher Programmaufruf!\n" );

printf( "Richtig: %s d: \\ c: \\Eigene Dateien\n", argv[0] );

exit(1);
}

ist wohl besser
(die meldung gilt aber nur für Windows)

dein programm funktioniert nur für das DIR das
du beim Aufruf mit übergeben hast. Für jedes gefundene
DIR mußt du natürlich ein neues opendir machen.

Xerxes
17-12-2002, 12:29
das ist mir schon klar, aber um ein neues opendir zu machen, muss ich ja erstmal rausfinden, ob der aktuelle eintrag ein dir ist, oder nicht. geht ja in c leider nicht so komfortable wie in php.
und das das programm für einen win-user gedacht ist, funktioniert ein bash-script leider nicht... ;-)

anda_skoa
17-12-2002, 13:12
Könntest du nicht einfach das find aus dem Cygwin Paket benutzen?

Ciao,
_

pik7
17-12-2002, 13:42
schnipp

entry = (*dir_handle).d_name;

chdir(search_dir);

stat( entry, &attribute );

schnap