[Gelöst]ftw() stürzt nach 17 Dateien ab
-
Hallo,
Ich benutze die methode ftw() wie sie hier erklärt wird.
Nun will ich ein Ordner mit sehr vielen unterordern und dateien durchgehen aber er stürzt mir immer nach der 17 ab.Ich tappe im dunkel weil meine Dateibehandlungsmethode nie eine zah != 0 returnt.
Und trotzdem hört es auf immer an der gleichen stelle.hier ein Code schnipsel:
ftw( ptr, fn, 16); ... ... ... static int fn(const char *pfadname, const struct stat *attribut, int flag) { if(pfadname[strlen(pfadname)-1]=='~')return 0; static int first = 1; static int deep; int i, dir_deep=0; const char *ptr = pfadname; switch(flag) { case FTW_F : { //pipeFiletoStdout(pfadname); cerr<<pfadname<<endl; break; } case FTW_D : cerr<<"FTW_D"<<endl; break; case FTW_DNR :/* cout<<"FTW_DNR"<<endl;*/ break; default :/* cout<<""<<endl;*/ break; } return 0; /* Wollen Sie ftw() stoppen, geben Sie 1 zurück */ //return 1; }
Bitte um Hilfe
-
Ist pfadname vielleicht 0? Oder ist strlen(pfadname)==0?
-
nein das ist es leider nicht
die pfadnamen sind alle laenger als 0
und sie sind != 0
-
Wenn ich die Funktion in ein Programm kopiere und in main nur ftw("/", fn, 16) ausführe, läuft er ohne Probleme durch das komplette Dateisystem. Auch, wenn ich Pfade habe, die 20 Ebenen tief oder tiefer verschachtelt sind.
Kannst Du mal ein funktionierendes Beispiel zusammenstellen, bei dem der Fehler auftritt?
-
Das hier ist mal ein Beispiel
und er stürzt immer an der selben stelle ab.
Die Menge de Dateien bis zum absturz scheint von pfad zu pfad unterschiedlich zu sein.#include <string> #include <ftw.h> #include <iostream> using namespace std; static int fn(const char *pfadname, const struct stat *attribut, int flag) { if(pfadname[strlen(pfadname)-1]=='~')return 0; static int first = 1; static int deep; int i, dir_deep=0; const char *ptr = pfadname; cout<<pfadname<<endl; switch(flag) { case FTW_F : { break; } case FTW_D : /*cerr<<"FTW_D"<<endl; */ break; case FTW_DNR :/* cout<<"FTW_DNR"<<endl;*/ break; default :/* cout<<""<<endl;*/ break; } return 0; /* Wollen Sie ftw() stoppen, geben Sie 1 zurück */ //return 1; } int main(int argv, char* argc[]) { const char *ptr = NULL; if(argv < 2) ptr = "."; else ptr = argc[1]; if( ftw( ptr, fn, 16) == 0 ) return EXIT_SUCCESS; else printf("Fehler bei ftw() ...!\n"); return EXIT_SUCCESS; }
-
Ich habe das Programm mit 2 großen (20.000-30.000 Dateien) und einem kleinen (100 Dateien) laufen lassen - ohne Absturz.
Wo stürzt das Programm ab? Stelle im Code? Verzeichnisname?
Gibt es vielleicht probleme mit Hard- /Softlinks?
Zirkuläre Links?Habe grade kein Linux zum Ausprobieren (der Test war unter cygwin).
-
Ich bin der Sache jetz näher gekommen.
Anscheinend tritt der Fehler immer auf bei dateien die dem User 'root' gehören.
Da ich das Programm durch eine NTFS Platte fegen lassen will kann ich den Besitzer nicht umstellen.Was kann ich jetzt tun dass es nicht abstürzt?
-
squareC schrieb:
Ich bin der Sache jetz näher gekommen.
Anscheinend tritt der Fehler immer auf bei dateien die dem User 'root' gehören.
Da ich das Programm durch eine NTFS Platte fegen lassen will kann ich den Besitzer nicht umstellen.Was kann ich jetzt tun dass es nicht abstürzt?
DU könntest auf Berechtigungen prüfen z.b. mit stat.
Also so in der Art:if Datei owns by root -> continue
Du könntest aber auch mal deine Datei unter root Rechten scannen lassen und schauen ob es dann immer noch abstürzt, wenn nicht - ist die Sache klar: Ein Berechtigungsproblem.
-
ich hab das Pronlem jetzt gelöst indem ich opendir() und readir() benutzt hab
trotzdem danke für die Hilfe