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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...