# [c#, ein bisl c++] bestimmte dateien in verzeichnis rekursiv löschen



## Anime-Otaku (26. August 2005)

hallo,
 ich habe nun seit ein paar Wochen mit dem Programmieren angefangen und bin immer noch ein wenig isch. Ich hab schon viel rum gegoogled und auch bei euch schon gesucht. Aber irgendwie steig ich da nicht richtig durch.

 Ich weiß zwar, dass  sich die Funktion selbst wieder aufrufen soll, aber wie man das hinkriegt ...kein Plan.

*Nun zum Programm*. Ich will ein Programm schreiben, dass mir ein Verzeichnis mit unter Verzeichnisen rekursiv durchsucht und alle Dateien die nach nem bestimmten Filter z.B. *.txt löscht. Das Program soll hauptsächlich in c# geschrieben werden (weils schneller sein soll). Geschrieben wird im Programm Visual c++ 7 (.net 2003), jedoch bitte keine .net elemente verwenden.danke.

 Bei meinem momentanen Programm löscht er natürlich nur die Dateien im selbigen Verzeichnis.

 usage over command shell (cmd):
 logclean.exe <dir> <filteroption>
 logclean.exe -         the program^^
 <dir>    -            the direct directory which files should be checked for deleting; e.g. c:\path\to\dir\
 <filteroption> -     which files should be deleted, e.g.     *.*(deletes all files)     or    fu*ba.txt
 */


```
#include <list>
 #include <stdio.h>
 #include <stdlib.h>
 #include <io.h>
 #include <string>
 using namespace std;
 
 	FILE *instream=0;
 	FILE *outstream=0;
 	const unsigned  char g_dirtmpbuf=255;
 	const unsigned int g_TLeng=1024;
 	unsigned long g_maxanz=0;
 
 struct TBuffer
 {
 	char m_Buffer [g_TLeng];
 	
 	TBuffer (const char *psz = 0)
 	{
 		memset (m_Buffer,0,g_TLeng);
 		if (psz)
 		{
 			strncpy (m_Buffer,psz,g_TLeng-1);
 		}
 	}
 };
 
 	typedef list<TBuffer> CHARARRAYLIST;
 
 
 int del(CHARARRAYLIST& myList, CHARARRAYLIST::iterator& myListPtr)
 {
 	//File.Delete("");
 	for ( myListPtr=myList.begin() ; myListPtr!=myList.end(); ++myListPtr)  //Ausgabe der filenames
 	{
 		const TBuffer & ptel = *myListPtr;
 		if((ptel.m_Buffer[0]=='.') && (ptel.m_Buffer[1]=='.') && (ptel.m_Buffer[2]=='\0') || (ptel.m_Buffer[0]=='.') && (ptel.m_Buffer[1]=='\0'))
 		{}
 		else
 		{
 			/*char tmpfile[g_dirtmpbuf];
 			memset(tmpfile,0,sizeof(tmpfile));
 			strncat(tmpfile,dir,strlen(dir));
 			strncat(tmpfile,ptel.m_Buffer,sizeof(ptel.m_Buffer));
 			const char* file=tmpfile;
 			*/
 			if(remove(ptel.m_Buffer)==-1)
 			{
 				printf( "remove of %s failed: %s\n",ptel.m_Buffer, strerror( errno ) );
 			}
 			else
 			{
 				printf( "Deleted %s\n",ptel.m_Buffer );
 			}
 		}
 	}
 		return 0;
 	
 }
 
 
 int readdir(char* dir,char* filter,CHARARRAYLIST& myList, CHARARRAYLIST::iterator& myListPtr)
 {
 
 	//CHARARRAYLIST myList; 
 	//CHARARRAYLIST::iterator myListPtr;   // and an iterator
 	struct _finddata_t prot;
 	long hFile;
 	char tmppath[g_dirtmpbuf];
 	//bool Found;
 	memset(tmppath,0,sizeof(tmppath));
 	strncat(tmppath,dir,strlen(dir));
 	char tmpdir[g_dirtmpbuf];
 	memset(tmpdir,0,sizeof(tmpdir));
 
 	if (g_maxanz==0)
 	{	
 		strncat(tmppath,filter,strlen(filter));
 		
 		if( (hFile = _findfirst(tmppath, &prot )) == -1 )
 		{
 		printf( "No files/dirs in current directory!\n"	 );
 		}
 		else
 		{
 			//TBuffer fname (prot.name);
 			strncat(tmpdir,dir,strlen(dir));
 			strncat(tmpdir,prot.name,strlen(prot.name));
 			myList.push_back(tmpdir);
 			
 			while( _findnext(hFile, &prot) == 0 )
 			{
 				g_maxanz++;
 			
 			//TBuffer fname (prot.name);
 			memset(tmpdir,0,sizeof(tmpdir));
 			strncat(tmpdir,dir,strlen(dir));
 			strncat(tmpdir,prot.name,strlen(prot.name));
 			myList.push_back(tmpdir);
 			
 			}
 
 		printf("%i files were read out\n",g_maxanz);
 		
 		}
 		_findclose( hFile );
 	}		
  
 		del(myList,myListPtr);
 
 	return 0;
 } 
 
 int main(int argc,const char** argv)
 {
 	
 	if (argc==3)
 	{
 		CHARARRAYLIST myList; 
 		CHARARRAYLIST::iterator myListPtr;   // and an iterator
 		char origdir[g_dirtmpbuf];	
 		memset(origdir,0,sizeof(origdir));
 		strncpy(origdir,argv[1],strlen(argv[1]));
 		char filter[g_dirtmpbuf];	
 		memset(filter,0,sizeof(origdir));
 		strncpy(filter,argv[2],strlen(argv[2]));   
 		readdir(origdir,filter,myList,myListPtr);
 	}
 
 	else
 	{
 		if (argc<3)
 		printf("too little arguments\nusage: <dir> <filterrule(e.g. *.*)>\nlook in the Readmer.txt for more Information");
 		else
 			printf("too much arguments\nusage: <dir> <filterrule(e.g. *.*)>\nlook in the Readme.txt for more Information\n");
 	}
 	return 0;
 
 }
```
 

 Ich hoffe ihr könnt mir helfen. Vielen Dank schonmal.

 P.S.: Dies ist mein 1. post in nem programmiererforum


----------



## deepthroat (26. August 2005)

Anime-Otaku hat gesagt.:
			
		

> Das Program soll hauptsächlich in c# geschrieben werden (weils schneller sein soll).


Schneller als was? Außerdem hängt die Geschwindigkeit des Programms meist nicht von der verwendeten Sprache, sondern vom Programmierer ab.



			
				Anime-Otaku hat gesagt.:
			
		

> P.S.: Dies ist mein 1. post in nem programmiererforum


Man merkt's.  Verwende doch bitte das nächste Mal die Code-Tags wenn du deinen Quelltext einfügst.

Zu deinem Programm: Ich finde du machst das alles etwas zu kompliziert. Erstens könntest du einfach Standard-Klassen wie z.B. string verwenden um nicht diese ganzen memcopy strncpy usw. machen zu müssen (aber das kommt wahrscheinlich erst mit der Zeit, da du sagt du programmierst noch nicht so lange).

Dann würde ich die rekursive Funktion wirklich einfacher gestalten (es ist auch nicht gerade hilfreich das du da call-by-reference verwendest, da mußt du ja dann innerhalb der Funktion jedesmal neue Objekte von Hand anlegen).

Ich würde folgende Grundstruktur vorschlagen (Pseudo-Code):
	
	
	



```
void delete_rekursiv (const char* verzeichnis, const char* glob) {
  // Gehe alle Einträge im Verzeichnis "verzeichnis" durch
  x = FindFirstFile (verzeichnis);
  do {
     // wenn der Eintrag ein Verzeichnis ist, dann rufe diese Funktion
     // rekursiv auf:
     if (isDirectory (x))
        delete_rekursiv (verzeichnis + x, glob);
     // wenn es kein Verzeichnis ist, und die Datei aber mit dem glob 
     // Pattern übereinstimmt, dann lösche Datei.
     else if (glob_match (glob, x))
        remove_file (verzeichnis + x);
  } while (x = FindNextFile (verzeichnis));
}
```


----------



## Anime-Otaku (29. August 2005)

vielen dank erstmal für die schnelle Antwort,
die struktur ist mir im groben klar, aber leider fehlt es an der feinarbeit,
also was man z.B. includen muss.
oder wie man das mit strings machen würde, dass kommt eh bald auf mich zu.

ein kompletten src-code dazu wie es aussehen könnte wäre nett.
Danke.

mata ne
Anime-Otaku

Update:

hat sich erledigt


----------

