Suppression repertoire

Résolu
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 1 oct. 2004 à 19:53
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006 - 23 mai 2008 à 19:21
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 oct. 2004 à 23:29
FindFirstFile et FindNextFile iront tres bien et c'est la rapidite assuree.

ciao...
BruNews, MVP VC++
3
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
1 oct. 2004 à 20:50
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
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
1 oct. 2004 à 21:54
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.
0
heptaeon Messages postés 4 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 01:05
J'ai entendu dire que SHFileOperation était meilleur, mais bon la je cherche a l'utiliser ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 nov. 2005 à 01:20
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++
0
heptaeon Messages postés 4 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 02:44
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 ?
0
heptaeon Messages postés 4 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 02:58
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
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 nov. 2005 à 11:42
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++
0
heptaeon Messages postés 4 Date d'inscription lundi 2 mai 2005 Statut Membre Dernière intervention 5 novembre 2005
5 nov. 2005 à 12:27
[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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 nov. 2005 à 12:53
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++
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
23 mai 2008 à 10:56
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 ?
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
23 mai 2008 à 19:21
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.
0
Rejoignez-nous