Suppression récursive de fichiers (deltree)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 991 fois - Téléchargée 21 fois

Contenu du snippet

Ce code permet de supprimer tous les fichiers d'un répertoire (placé en paramètre) sans supprimer celui-ci. Très pratique lorsque l'on veut supprimer les fichiers d'un dossier système qui ne peut pas être supprimé. La commande deltree réalisait cette tâche avant.

Source / Exemple :


//fonction permettant la suppression du contenu d'un répertoire sans le supprimer
void DeleteAll(TCHAR * repertoire)
{
 TCHAR Path[MAX_PATH] ;
 _tcscpy(Path, repertoire) ; 
 _tcscat(Path, TEXT("\\*")) ; 
 TCHAR dossier[MAX_PATH] ;
 _tcscpy(dossier, repertoire) ; 
 _tcscat(dossier, TEXT("\\")) ;
 WIN32_FIND_DATA wfd;
 HANDLE hfl = FindFirstFile(Path, &wfd); // Recherche du premier fichier du répertoire
 if(hfl != INVALID_HANDLE_VALUE) 
 {
	_tcscat(dossier, wfd.cFileName) ;
    if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) // Si il s'agit d'un dossier
	{
	   DeleteAll(dossier) ; // Suppression récursive des dossiers
	   RemoveDirectory(dossier) ; // Suppression du dossier
	}
	else
	{
	   DeleteFile(dossier); // Suppression du fichier
	}
    while(FindNextFile(hfl, &wfd)) // Tant qu'il y a de nouveaux fichiers
	{
		_tcscpy(dossier, repertoire) ;
		_tcscat(dossier, TEXT("\\")) ;
        _tcscat(dossier, wfd.cFileName) ;
		if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) // Si il s'agit d'un dossier
		{
		   DeleteAll(dossier) ; // Suppression récursive des dossiers
	       RemoveDirectory(dossier) ; // Suppression du dossier
		}
		else
		{
		   DeleteFile(dossier); // Suppression du fichier
		}
	}
    FindClose(hfl); // Fermeture du dossier de recherche
 }
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
6
Date d'inscription
samedi 25 novembre 2006
Statut
Membre
Dernière intervention
4 novembre 2010

Bonjour.
Pouviez-vous me dire quelles sont les classes à importer?
Merci
Messages postés
1
Date d'inscription
mercredi 4 mars 2009
Statut
Membre
Dernière intervention
30 mars 2009

Bonjour,

J'ai tester la fonction sur un dossier C:\doss\ qui contient un fichier test.txt
et lorsque je lui done C:\doss ( comme la fonction rajoute le \* )

Ca boucle infini et la variable dossier vaut :

"C:\doss\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\." etc ..

Pourtant il n'y a qu'un seul fichier dans ce dossier :s
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
il faut un peu plus factoriser le code :


//fonction permettant la suppression du contenu d'un répertoire sans le supprimer
void DeleteAll(TCHAR * repertoire)
{
TCHAR Path[MAX_PATH] ;
_tcscpy(Path, repertoire) ;
_tcscat(Path, TEXT("\\*")) ;
TCHAR dossier[MAX_PATH] ;
WIN32_FIND_DATA wfd;
HANDLE hfl = FindFirstFile(Path, &wfd); // Recherche du premier fichier du répertoire
if(hfl != INVALID_HANDLE_VALUE)
{
do
{
_tcscpy(dossier, repertoire) ;
_tcscat(dossier, TEXT("\")) ;
_tcscat(dossier, wfd.cFileName) ;
if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) // Si il s'agit d'un dossier
{
DeleteAll(dossier) ; // Suppression récursive des dossiers
RemoveDirectory(dossier) ; // Suppression du dossier
}
else
{
DeleteFile(dossier); // Suppression du fichier
}
}
while(FindNextFile(hfl, &wfd)); // Tant qu'il y a de nouveaux fichiers
FindClose(hfl); // Fermeture du dossier de recherche
}
}

apres je ne suis pas sous win mais ne pourrais tu pas garder qu'un seul des deux buffers ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.