PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: alle Dateien eines Verzeichnisses bearbeiten?



Ginsengelf
20-01-2004, 14:45
Moin, ich möchte alle Dateien meines mp3-Verzeichnisses bearbeiten, und suche eine Funktion, die einfach einen Dateinamen holt, ich die Datei bearbeiten kann, die Funktion mir die nächste Datei liefert, etc, ohne dass ich wie bei fopen jeden Dateinamen übergeben muss.

Gibt es sowas, oder muss ich mir was zurechtfrickeln?

Ginsengelf

anda_skoa
20-01-2004, 14:54
Du könntest dir ja die Dateinamen auf der Commandline übergeben lassen.

Entweder einzeln, also ein Programmaufruf pro Datei, oder mehere Dateien pro Aufruf, siehe find und xargs

#> find . -name "*.mp3" -exec myprog {} \;
einmal pro Datei

#> find . -name "*,mp3" | xargs myprog
mehrere Dateien pro Aufruf

Ciao,
_

Ginsengelf
20-01-2004, 15:03
Ja, das hatte ich auch schon gedacht, fand ich aber irgendwie unschön :)

r00t043
20-01-2004, 16:40
#include <ftw.h>

int ftw( const char *path,
int (*fn)(const char *name, const struct stat *status, int flag),
int descriptors);

'path' stellt das Wurzelverzeichniss da, von dem du ausgehst
'fn' ist ein Zeiger auf eine Funktion, die auf jedes Objekt angewendet wird, und den Namen des aktuellen Objektes beckommt eine Struktur vom Typ stat und ein Flag bekommt
'descriptors' sind die maximale Anzahl derer, die ftw offen haben darf
das Flag sollte mit FTW_F übereinstimme sonst haste grade keine Datei... ( FTW_F und Konsorten findest du in ftw.h )
wobei ein Objekt ein Element der Menge aller Dateien, Verzeichnisse, Links und anderen Schrott sei der sich in dem Verzeichniss und seinen Unterverzeichnissen befindet.

Happy Hacking

Ginsengelf
20-01-2004, 23:06
Ja, das sieht schonmal gut aus.
nur eine Frage habe ich noch: der gcc meckert imemr, wenn ich eine Funktion mit Parametern als Argument in ftw() einsetze, bekomme ich die Meldung:

warning: passing arg 2 of `ftw' makes pointer from integer without a cast

p_fkt ist ein Funktionszeiger, der außerhalb von ftw auch funktioniert.
Das komplette Programm (ist nur zum rumprobieren):

#include <stdio.h>
#include <stdlib.h>
#include <ftw.h>

int print(const char *name, const struct stat *s_status, int flag);


struct stat status;

int main(int argc, char* argv[])
{
char *path="./test";
int (*p_fkt)(const char*, const struct stat*, int);

p_fkt=print;

ftw(path, p_fkt(path,&status, FTW_F), 5);

return(EXIT_SUCCESS);
}

int print(const char* name , const struct stat *s_status , int flag)
{
printf("%s\n",name);
return(0);
}


Wenn ich nur p_fkt als Zeiger auf eine Funktion ohne Parameter angebe, läuft das Programm...

Ginsengelf

r00t043
20-01-2004, 23:38
haste auch recht, die Argumente kriegt die Funktion von ftw...


#include <stdio.h>
#include <stdlib.h>
#include <ftw.h>

int print( const char *, const struct stat *, int );

int main( int argc, char* argv[] ){
ftw( "./test", print, 5 );
exit(EXIT_SUCCESS );
}

int print(const char* name , const struct stat *status , int flag){
if( flag == FTW_F )
printf( "%s\n", name );
return 0;
}

Das sollte funktionieren und dir nur die Dateien ausgeben, deswegen der vergleich: flag == FTW_F

Ginsengelf
21-01-2004, 17:39
Danke, nun funktioniert's so wie es soll.

Ginsengelf

schwarzbarde
16-07-2004, 22:48
Und wie kann man es schaffen, das man die Ausgabe von ftw dateiweise in einen String packt?

r00t043
17-07-2004, 11:15
ftw macht eine Ausgabe?

SeeksTheMoon
24-07-2004, 00:12
wo gehört die ftw.h hin? Ich finde die weder bei der Standardlib noch bei Unix-Systemprogrammierung.

Du kannst auch sowas versuchen:

#include <dirent.h>

DIR* bildverzeichnis = opendir("Musik");
struct dirent* inhalt;

while ( (inhalt = readdir(bildverzeichnis) ) !=NULL ) {
if(strstr((const char*)inhalt->d_name,".mp3")!=NULL) {
...
}}
In dem if kannst Du Dir z.B. mit inhalt->d_name die Dateinamen ausgeben lassen oder auch einen FILE-Zeiger auf den Namen erstellen und damit dann noch wildere Sachen anstellen :D

r00t043
31-07-2004, 20:27
2ten Zeile von ftw.h behaupted:

This file is part of the GNU C Library.
genauso wie mein 'apt-file' mir sagt das sie im Packet libc6-dev enthalten ist