S
sniper
Jungspund
Hallo,
ich will ein C Programm schreiben welches das ganze Unix System nach einer bestimmten Dateiart sucht. Am ende sollen alle Pfade ausgeben werden wo sich die Dateien befinden. Ein Teil hab ich schon geschrieben der funktioniert, nur nicht mit der gewünschten Funktion weil es nur ein Ordner durchsuchen kann. Ich muss aber das ganze System durchsuchen und ich komm nicht weiter… Hat jemand eine Idee wie es funktionieren könnte?
Hier ist mein Programm:
Und so sieht die Augabe bis jetzt (sie wurde nur zur Testzwecken gemacht) wenn das Programm keine Datei gefunden hat. Wenn er die Datei findet dann steht noch der ganzer Pfad von der Datei in der Ausgabe.
ich will ein C Programm schreiben welches das ganze Unix System nach einer bestimmten Dateiart sucht. Am ende sollen alle Pfade ausgeben werden wo sich die Dateien befinden. Ein Teil hab ich schon geschrieben der funktioniert, nur nicht mit der gewünschten Funktion weil es nur ein Ordner durchsuchen kann. Ich muss aber das ganze System durchsuchen und ich komm nicht weiter… Hat jemand eine Idee wie es funktionieren könnte?
Hier ist mein Programm:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>
// die Dateiart die gesucht wird
#define STR_EXTENSION ".xxx"
#define LENGTH_OF_STRING(x) (sizeof(x)-1)
int main () {
struct stat FileInfo;
struct dirent *CurrentFile;
DIR *Directory;
char chl_Path[256];
int inl_ordnerZaehler = 0;
int inl_xxxZaehler = 0;
// von diesen Punkt fängt das Programm mit der Suche an
char chl_anfangsPath[] = { "/" };
/// Öffnet das Verzeichnis
if ( (Directory = opendir(chl_anfangsPath)) == NULL) {
perror("opendir()");
return EXIT_FAILURE;
}
else {
/// bis das Programm alle Dateien durchgelaufen hat
while ( (CurrentFile = readdir(Directory)) != NULL) {
int inl_slaenge = 0;
if (strcmp(CurrentFile->d_name,".") && strcmp(CurrentFile->d_name,"..")) {
// kopiert den String in chl_Path
strcpy(chl_Path,chl_anfangsPath);
// hängt das zweite an das erste an
strcat(chl_Path,CurrentFile->d_name);
// brauchen wir um die Attribute der Datei ausgelesen zu können
if (stat(chl_Path,&FileInfo) == -1) {
perror("stat()");
closedir(Directory);
return EXIT_FAILURE;
}
/// wenn die Datei lesbar ist
if(access(chl_Path, R_OK) == 0){
/// wenn es sich um ein Ordner handelt
if (S_ISDIR(FileInfo.st_mode)) {
// erzeugt ein array welcher alle adressen von den verschiedenen Ordner speichert
long il_pos[inl_ordnerZaehler];
// zuweisung der Adressen
il_pos[inl_ordnerZaehler] = telldir(Directory);
// erzeugt ein array welcher alle Namen von Ordner aus dem aktuellen Verzeichnis speichert
char chl_Ordner[inl_ordnerZaehler][128];
strcpy(chl_Ordner[inl_ordnerZaehler],CurrentFile->d_name);
printf("%d.\t",inl_ordnerZaehler+1);
printf("%s \t\t",chl_Path);
printf("pos.: %ld\n",il_pos[inl_ordnerZaehler]);
inl_ordnerZaehler++;
}
/// wenn es sich um eine Datei handelt
else if (S_ISREG(FileInfo.st_mode)) {
inl_slaenge = strlen(CurrentFile->d_name);
char *str_rueckgabe;
int im_c = '.';
str_rueckgabe = strchr ( CurrentFile->d_name, im_c );
/// wenn er die ".xxx" Datei gefunden hat
if ((strcmp(STR_EXTENSION,CurrentFile->d_name+inl_slaenge-LENGTH_OF_STRING(STR_EXTENSION))) == 0){
char chl_xxx[inl_xxxZaehler][256];
strcpy(chl_xxx[inl_xxxZaehler],chl_Path);
printf("XXX Path: %s \n",chl_xxx[inl_xxxZaehler]);
inl_xxxZaehler++;
}
} // end of else if
} // end of if (wenn die Datei lesbar ist)
}
} //end while
closedir(Directory);
} // end of else
return EXIT_SUCCESS;
} //end main
Und so sieht die Augabe bis jetzt (sie wurde nur zur Testzwecken gemacht) wenn das Programm keine Datei gefunden hat. Wenn er die Datei findet dann steht noch der ganzer Pfad von der Datei in der Ausgabe.
Code:
1. /bin pos.: 2354688
2. /dev pos.: 2401792
3. /etc pos.: 2529152
4. /lib pos.: 2563328
5. /mnt pos.: 2609920
6. /opt pos.: 2700672
7. /srv pos.: 2711168
8. /tmp pos.: 2713728
9. /sys pos.: 2730880
10. /var pos.: 2744576
11. /usr pos.: 25652864
12. /boot pos.: 27051904
13. /home pos.: 29009280
14. /proc pos.: 29360256
15. /sbin pos.: 29415552
16. /data1 pos.: 284135552
17. /data2 pos.: 307945600
18. /media pos.: 1091284480
19. /freebsd pos.: 1383414400