Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo,

ich arbeite gerade an einem Programm in C. Dieses Programm soll bei einem Übergebenen parameter alle Ordner rekursiv durchsuchen auch die Unterordner.

Ich hab natürlich schon daran gearbeitet, leider läuft(bzw findet) das Programm im moment so:

1. Ordner-> 1. Unterordner -> Files im 1.Unterordner ->

1.Ordner -> 2. Unterordner -> Files im 2. Unterordner->

78628284.png

2. Ordner -> 1. Unterordner -> Files im 1.Unterordner ->

2.Ordner -> 2. Unterordner -> Files im 2. Unterordner->

57432378.png

2. Ordner-> 3. Ordner-> 4. Ordner-> 5.Ordner

23338876.png

Die Ausgabe:

12969016.png

ergo:

Der Pfad wird nciht richtig angegeben und er sucht dann nachm 2ten Ordner nicht mehr in den Unterordnern

irgendwo im Code muss ein Fehler sein :/ aber ich finde ihn einfach nicht :(

#include "stdafx.h"

#include "stdio.h"

#include "windows.h"



TCHAR* files(TCHAR* path)

{

	int len;

	TCHAR savepath[MAX_PATH];


	WIN32_FIND_DATA fd;

	HANDLE h;


	strncat(path,(_T("*.*")),sizeof("*.*"));

	_tcscpy(savepath,path);


	h = FindFirstFile(path, &fd);


	if (h != INVALID_HANDLE_VALUE) 

	{

        do 

		{

            if (((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY))

			{

				int result = strcmp(fd.cFileName, "."); 

				int result2 = strcmp(fd.cFileName, "..");

                if (result != 0 && result2 != 0)

				{

					//anhaengen(path,fd);

					printf("Suche im Verzeichnis \"%s\"\n", fd.cFileName);

					len = strlen(path);

					_tcscpy(&path[len-3],(_T("\0")));

					strncat(path,fd.cFileName,sizeof(fd.cFileName));

					strncat(path,"\\\\",sizeof("\\\\"));

					_tcscpy(foldername,fd.cFileName);

					files(path);

				}

			}

			else

			{

				len = strlen(path);

				_tcscpy(&path[len-3],(_T("\0")));

				printf("Im Pfad \"%s\", File \"%s\" gefunden\n",path,fd.cFileName);

				strncat(path,"*.*",sizeof("*.*"));

			}

			path=savepath;

		} while (FindNextFile(h,&fd));	

	}

	//_tcscpy(path,(_T("C:\\\\*.*")));

	FindClose(h);

	return 0;

}



int _tmain(int argc, _TCHAR* argv[])

{

	files(argv[1]);

	getchar();

	return 0;

}

Als Parameter wird C:\\ übergeben!

Ich hatte auch schon in der Suche geschaut hier im Forum und diversen anderen Foren aber irgendwie waren da entweder Sachen drinnen die ich nicht usen soll zB cout<< oder was das ist :< oder es war in einer anderen Sprache zB C++/C# hab zwar versucht die Codes soweit auseinander zu basteln das cih die auch versteh (programmiere noch nicht solange) aber weit bin ich damit nicht gekommen :/

Wäre super wenn mir einer von euch helfen kann :D

Geschrieben

Der Code ist unvollständig, foldername ist nirgends deklariert, die Variable ist aber nicht weiter relevant.

Das Problem ist, dass das "Zurücksetzen" auf savepath nicht richtig umgesetzt ist. Du verbiegst nämlich nur den Zeiger path auf dein Array savepath. Ab dem zweiten Schleifendurchlauf verweisen die beiden also auf denselben Speicherbereich, und damit hängst du weitere Unterverzeichnisse auch an savepath an, die nachfolgenden Zurücksetzungen bewirken gar nichts mehr.

Übrigens solltest du, wenn du denn TCHAR benutzen möchtest, das auch konsequent durchziehen. Momentan ist das ein wilder Mischmasch aus char/strlen/strncat und TCHAR/_tcscpy, der nur bewirkt, dass sich der Code nicht mit Unicode übersetzen lässt.

Du solltest auch bedenken, dass du nicht einfach irgendetwas an path dranhängen solltest. Du weißt nicht, wie groß der Puffer ist, den der Aufrufer für den Parameter reserviert hat.

Und kannst du mir erklären, warum du hinten einen doppelten Backslash anhängst?

Geschrieben

naja hab bissl im Code rumprobiert und von den resten die nicht funktioniert haben nicht alles gelöscht .. xd

doppelt weil der parameter das sonst net richtig übernimmt :/ bzw hats bei nem einfachen net richtig funktioniert

also liegts am savepath werd da nochmal drüberschauen :) fand das halt nur merkwürdig weil es anfangs ja richtig funktioniert und später immer weniger

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...