Neues Problem für 'Ordner durchsuchen'

Guten Nachmittag

Dank eurer Hilfe ist es mir gelungen, eine Funktion in meiner kleinen privaten Bibliothek zu schreiben, die einen Ordner durchsucht (/t/ordner-durchsuchen/4942676/11

Die Funktion nimmt 4 Parameter:

int listOrdner(char pfad[500],int ordnerZeigen,int risikoEingehen,char \*resultat[150][500]);
  • pfad enthält den Pfad des zu durchsuchenden Ordners.
  • ordnerZeigen filtert die Resultate: -1: Nur Dateien, 0: Alles, 1: Nur Ordner
  • risikoEingehen verhindert, dass das Programm abstürzt: Falls 0, bricht die Funktion ab, falls keine Datei am angegebenen Pfad erstellt werden konnte. Falls 1, fährt die Funktion trotzdem weiter.
  • In *resultat werden die im Ordner enthaltenen Dateinamen hineingeschrieben.

Hier ist der Quellcode:

char\* dirList(char \*path, int \*isDir, DWORD \*size)
{
 static WIN32\_FIND\_DATAA wfd;
 static HANDLE hFind;
 size = 0;
 /\* if (!isDir || !size) {return "error: pointers have no memory...\n";}
 \*/

 if (path)
 {
 ZeroMemory(&wfd, sizeof(WIN32\_FIND\_DATAA));
 hFind = INVALID\_HANDLE\_VALUE;
 hFind = FindFirstFile(path, &wfd);
 if (hFind == INVALID\_HANDLE\_VALUE)
 {FindClose(hFind); return 0;}
 }
 else {
 if (! FindNextFile(hFind, &wfd))
 {FindClose(hFind); return NULL;}
 }

 if (wfd.dwFileAttributes & FILE\_ATTRIBUTE\_DIRECTORY)
 { \*isDir = 1; 
 /\* \*size = 0; \*/
 }
 else
 { \*isDir = 0; 
 /\* \*size = wfd.nFileSizeLow; \*/
 }

 return wfd.cFileName;
}
int listOrdner(char pfad[500],int ordnerZeigen,int risikoEingehen,char \*resultat[150][500])
{
 long zaehler=0;
 FILE \*fTest;
 char fileTemp[500];
 strcpy(fileTemp,pfad);
 for(zaehler=strlen(fileTemp);fileTemp[zaehler]!='/';zaehler--);
 fileTemp[zaehler+1]='\0';
 strcat(fileTemp,"einfTest123.xy");
 fTest=fopen(fileTemp,"w");
 if(fTest==NULL)
 {
 if(!risikoEingehen){return 0;}
 }else{fclose(fTest); remove(fileTemp);}

 zaehler=0;
 /\* "C:/winnt/\*.\*"; = Ordner und Dateien kriegen 
 (\*.\* in beliebiger Kombination) \*/
 char \*findWhere = pfad; 
 DWORD gr = 0;
 int isDir = 0;
 //printf ("press any key to read:\n");
 /\* beim ersten Mal Pfad uebergeben... \*/
 char \*got = dirList(findWhere, &isDir, &gr);
 do
 {
 if ((\*got == '.') || (\*got == '?')) {continue;}
 switch(ordnerZeigen)
 {
 case 1:
 if(isDir){sprintf (&resultat[zaehler],"#%s",got);}
 break;
 case 0:
 if(isDir){sprintf (&resultat[zaehler],"#%s",got);}
 else{sprintf (&resultat[zaehler],"%s",got);}
 break;
 case -1:
 if(!isDir){sprintf (&resultat[zaehler],"%s",got);}
 break;
 default:
 return 0;
 break;
 }

 zaehler++;
 } 
 /\*...dann NULL \*/
 while (got = dirList(NULL, &isDir, &gr));
 return 1;
}

Der Compiler von Dev-C++ meldet, dass bestimmte Variablentypen unkompatibel seien ("[Warning] passing arg 1 of `sprintf’ from incompatible pointer type"); in

sprintf (&resultat[zaehler],"%s",got);

Zudem buggt die Funktion häufig, aber immer anders, manchmal bring sie das Programm auch zum Absturz, aber auf einem anderen Computer funktoniert das gleiche Programm fehlerlos…
Ich verstehe den Quellcode nur zum Teil (habe ihn hier im Forum erhalten) und habe ihn einfach abgeändert.

Wo ist dieser teuflische Bug?! Nach stundenlanger Suche und x Versuchen habe ich es aufgegeben.

Danke für eure Hilfe
Euer erschöpfter
Kalsan

Hallo Kalsan

Du hast eine Variable „ordnerZeigen“ (die ich für entbehrlich halte, siehe unten), mit den genannten Optionen. Dies wird jedoch so gar nicht an die dirList() übergeben, die weiss also nichts davon, dass sie das soll…
Überprüfe das mal.

In meiner Quelle vom letzten Mal war schon der Hinweis:

 /\* "C:/winnt/\*.\*"; = Ordner und Dateien kriegen 
 (\*.\* in beliebiger Kombination) \*/

Beachte hier vor allem die erste Zeile! Die „*.*“ machen es, dass auch nach Ordnern gesucht wird.
Das „in beliebiger Kombination“ meinte, du kannst „*.ini“ oder auch „briefe.*“ suchen.

lG
Martin B

Hallo

Dank eurer Hilfe ist es mir gelungen, eine Funktion in meiner
kleinen privaten Bibliothek zu schreiben, die einen Ordner
durchsucht
Die Funktion nimmt 4 Parameter:

int listOrdner(char pfad[500],int ordnerZeigen,int risikoEingehen,char *resultat[150][500]);

falsch. Mach mal

int listOrdner(char pfad[500],int ordnerZeigen,int risikoEingehen,char resultat[150][500])

draus.

int listOrdner(char pfad[500],int ordnerZeigen,int :risikoEingehen,char *resultat[150][500])

int listOrdner(char pfad[500],int ordnerZeigen,int risikoEingehen,char resultat[150][500])

case 1:
if(isDir){sprintf (&resultat[zaehler],"#%s",got);}
break;
case 0:
if(isDir){sprintf (&resultat[zaehler],"#%s",got);}
else{sprintf (&resultat[zaehler],"%s",got);}
break;
case -1:
if(!isDir){sprintf (&resultat[zaehler],"%s",got);}
break;
default:

 ...
 case 1:
 if(isDir){sprintf (resultat[zaehler],"#%s",got);}
 break;
 case 0:
 if(isDir){sprintf (resultat[zaehler],"#%s",got);}
 else{sprintf (resultat[zaehler],"%s",got);}
 break;
 case -1:
 if(!isDir){sprintf (resultat[zaehler],"%s",got);}
 break;
...

Der Compiler von Dev-C++ meldet, dass bestimmte Variablentypen
unkompatibel seien ("[Warning] passing arg 1 of `sprintf’ from
incompatible pointer type"); in

sprintf (&resultat[zaehler],"%s",got);

Siehe oben.

Zudem buggt die Funktion häufig, aber immer anders, manchmal
bring sie das Programm auch zum Absturz, aber auf einem
anderen Computer funktoniert das gleiche Programm fehlerlos…
Ich verstehe den Quellcode nur zum Teil (habe ihn hier im
Forum erhalten) und habe ihn einfach abgeändert.

Wo ist dieser teuflische Bug?! Nach stundenlanger Suche und x
Versuchen habe ich es aufgegeben.

Der ganze Ansatz ist imho „receipe to disaster“. Ich kenne
Deinen Caller (aufrufende Funktion) nicht, aber je nach
Deklaration des Feldes für die Dateinamen ist ein Stack-
Error wahrscheinlich (mal, mal nicht).

Erklär bitte nochmal genau, warum Du keine
C+±Elemente mit verwenden möchtest.

Grüße

CMБ

Hallo Semjon

Habe deinen Vorschlag aus Zeitgründen noch nicht ausprobiert, aber auf die Frage, wieso ich nur C will, kann ich dir schnell antworten:
Ich kenne C++ noch nicht :-° (ich werd’s bald lernen)
In der Hoffnung, den Quellcode zu verstehen, forderte ich C an.
Auch deshalb, weil alle meine bisherigen Programme in C geschrieben sind und diese Bibliothek dort verwendet wird.

Danke für deine Hilfe!
Gruss
Kalsan

BINGO: Neues Problem für ‚Ordner durchsuchen‘ ->
So einfach? Und prompt… Der hat gesessen und gegessen und den Code gefressen.

Schon wider konnte mir das Forum helfen! Herzlichsten Dank, Semjon & co!

Kalsan

Hallo Kalsan

Hallo Martin

Du hast eine Variable „ordnerZeigen“ (die ich für entbehrlich
halte, siehe unten), mit den genannten Optionen. Dies wird
jedoch so gar nicht an die dirList() übergeben, die weiss also
nichts davon, dass sie das soll…
Überprüfe das mal.

Dies war anscheinend nicht der Fehler. Ich hatte Probleme mit den Pointern (siehe Antwort von Semjon)

In meiner Quelle vom letzten Mal war schon der Hinweis:

/* „C:/winnt/*.*“; = Ordner und Dateien kriegen
(*.* in beliebiger Kombination) */

Beachte hier vor allem die erste Zeile! Die „*.*“ machen es,
dass auch nach Ordnern gesucht wird.
Das „in beliebiger Kombination“ meinte, du kannst „*.ini“ oder
auch „briefe.*“ suchen.

Dies ist mir klar, wie bei der Windows-Suchfunktion (Start+F). Das Problem hat sich mittlerweile ganz unkompliziert gelöst.

lG
Martin B

Danke für alles!
Kalsan