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