Suppression repertoire [Résolu]

Signaler
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006
-
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006
-
Bonjour et merci de lire mon poste

En faite j'ai 2 questions.

- 1 -
Est-il possible de supprimer un repertoire contenant des fichiers? Il me semble que non, il faut d'abord en supprimer tout les fichiers.

- 2 -
Pour supprimer tous les fichiers d'un repertoire, vaut-il mieux utiliser la methode :
- FindFirstFile(...) et FindNextFile(....) pour lister des fichiers, puis DeleteFile(...)
ou
- SHFileOperation avec comme parametre *.*

Merci

12 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
FindFirstFile et FindNextFile iront tres bien et c'est la rapidite assuree.

ciao...
BruNews, MVP VC++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Salut,
Pour supprimer un répertoire utilise l'API RemoveDirectory().
En effet il faut que le repertoire soit vide.

Sinon si tu veux faire simple, utilise la fonction systeme et appelle la commande dos del mon_rep pour tout automatisé.

system("del mon_rep");


Shell
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

oui je connais system() mais c'est pas tres elegant les command dos qui s'ouvre et ce ferme. Cela peut faire peure a mes futurs utilisateurs.
Messages postés
4
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
5 novembre 2005

J'ai entendu dire que SHFileOperation était meilleur, mais bon la je cherche a l'utiliser ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
dépend ce que tu entends par "meilleur", pour la vitesse assurément NON, si tu veux que les boites de confirmation et l'animation soient visibles alors c'est fait pour cela.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
4
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
5 novembre 2005

J'entend meilleur car c'est le conseil de la MSDN, et que j'estime que MS connais quant meme l'API qu'il ont programmer.
Quant tu dit pour la vitesse assurément non, tu as fait des benchs pour tester ? Ou d'où te provient ton information ?
Messages postés
4
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
5 novembre 2005

Au passage je vais me rendre un peu utile ^^


Pour la première question, je dit OUI :p


SHFILEOPSTRUCT FileOperation; // notre structure d'information
ZeroMemory(&FileOperation,
sizeof(FileOperation)); //On ne sais pas ce qu'on a des base ^^
FileOperation.hwnd = NULL; //Ou le HWND de ta fenetre si tu veux les réponses d'erreure en boite de dialogue

FileOperation.wFunc = FO_DELETE; // On cherchera a effacer ^^
FileOperation.pFrom = "C:\\Ton\\Repertoire\\A_Effacer"; //Le chemin de qui il te faut supprimer
FileOperation.fFlags = FOF_NOCONFIRMATION; //Je en veux pas les confirmation



if(SHFileOperation(&FileOperation))
{
//Il y a eu une erreure
}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
pFrom DOIT être terminé par un double NULL.


Je ne vois pas sur la page SHFileOperation de MSDN quoi que ce soit qui dise qu'il faut préférer cette fonction aux appels directs de l'API (la vraie de base: DeleteFile, RemoveDirectory, etc...). Ces fonctions très haut niveau du Shell ne sont que des wrapper de l'API, elles simplifient la vie des VBistes et autres bidouilloux mais dans tous les cas elles finissent par appeler l'API.


Des benchs pour savoir si une ligne droite est plus courte que 36 détours, inutile, c'est évident.
Pour info, j'ai légalement les sources de tous les Windows, ce que tu aurais pu comprendre au look de ma signature.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
4
Date d'inscription
lundi 2 mai 2005
Statut
Membre
Dernière intervention
5 novembre 2005

[Extrais de l'MSDN]


Remarks

The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.


To recursively delete the files in a directory, use the SHFileOperation function.

/Extrais

Le lien est ici : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/removedirectory.asp

Quant a ta comparaison ligne droite vs détour, je ne suis pas tout a fait de ton avis. On retrouve souvent des fonctions dites "plus haut niveau" plus performante. Simplement car elle ne refond pas toujours les même opération de vérification. Elle utilise des "Sorte de racourcis".

Par contre si tu as le code source de cette fonction et que tu me certifie qu'elle utilise des RemoveDirectory, Je suis de ton avis si c'est bien compiler utiliser une boucle de RemoveDirectory bien faite est plus performante.

Personelement, Je n'ai pas les code sources de windows, donc a toi de voir ce qu'il y a dans le code de cette fonction ^^.

Ps: Juste pour le pFrom, mon code marchais car l'élément suivant est a NULL, mais c'etait un coup de bol :D
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Regarde ces exemples, il y a très peu à modifier pour faire du delete:
http://www.cppfrance.com/code.aspx?id=18599
http://www.cppfrance.com/code.aspx?id=16638

et travail fini (issu d'un prog pour un client):

typedef struct tagDIRWD {
WIN32_FIND_DATA wfd;
char szpthDst[264];
char *pendDst;
char buff[264];
} DIRWD, *LPDIRWD;


void __stdcall ViderDossier(LPDIRWD pdw)
{
HANDLE hfind;
strcat(pdw->szpthDst, "\\*.*");
hfind = FindFirstFile(pdw->szpthDst, &pdw->wfd);
pdw->szpthDst[strlen(pdw->szpthDst) - 3] = 0;
if(hfind == INVALID_HANDLE_VALUE) return;
nextfl:
if(pdw->wfd.cFileName[0] == '.') goto verifnext;
if(pdw->wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
strcat(pdw->szpthDst, pdw->wfd.cFileName);
ViderDossier(pdw);
}
else {
bnstrcpy(bnstrcpy(pdw->buff, pdw->szpthDst), pdw->wfd.cFileName);
SetFileAttributes(pdw->buff, FILE_ATTRIBUTE_NORMAL);
DeleteFile(pdw->buff);
}
verifnext:
if(FindNextFile(hfind, &pdw->wfd)) goto nextfl;
if(hfind != INVALID_HANDLE_VALUE) {
char *c;
FindClose(hfind);
c = pdw->pendDst;
while(*c) c++; // SUR ZERO FINAL
if((c -= 2) <= pdw->pendDst) return; // SI NON RACINE, RECULE DE 1 DOSSIER
while((*c != '\\') && (c > pdw->pendDst)) c--;
if(++c < pdw->pendDst) c = pdw->pendDst;
if(c > pdw->pendDst) { // CONSERVE DOSSIER DE BASE
SetFileAttributes(pdw->szpthDst, FILE_ATTRIBUTE_NORMAL);
RemoveDirectory(pdw->szpthDst);
}
*c = 0;
}
}

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Bonjour, je cherche aussi a supprimer un repertoire.

Pour faire simple j'ai voulu essayer system("del mon_rep")

Mon repertoire étant C:/Documents and Settings/XXX/Local
Settings/Application Data/etcetc, la fenetre dos me repond : "Option
non valide "Documents".."

Je pense que cela est du à l'espace, mais par quoi le remplacer ?
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Tu a du te tromper. Ici, on parle de C/C++ et non de DOS.
Ce n'est pas le bon lieu pour parler de batch en DOC.
Si non oui, cela vient bien des espaces, mets le chemin entre guillemets.