Bonjour j'ai une petite question toute bete on peut effacer des fichiers avec "remove(...)" mais pour effacer un dossier quel fonction utiliser!!
merci jérémy
Bonjour j'ai une petite question toute bete on peut effacer des fichiers avec "remove(...)" mais pour effacer un dossier quel fonction utiliser!!
merci jérémy
Il y a bien _rmdir() <dir.h> mais je ne suis pas sûr que ce soit portable.Envoyé par Jérémy Lefevre
si tu es sur *n*x :
ou en C :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 rm -rf dossier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 statut = system ( "rm -rf dossier");
Hello,
En effet, sur beaucoup d'unixoïdes, remove() était simplement un alias d'unlink avec les libc fournies et ne pouvait donc pas enlever des répertoires. Il y a plusieurs solutions : utiliser explicitement le rmdir() POSIX (http://www.opengroup.org/onlinepubs/...ons/rmdir.html), ou utiliser la fonction remove() conforme POSIX (elle est aussi bien sûr dans la même libc, mais son comportement peut varier selon les options de compilation choisies) qui doit normalement faire appel à rmdir() pour les répertoire.Envoyé par Jérémy Lefevre
A+
Hello,
il y a bien des fonctions POSIX remove() et rmdir() permettant d'accomplir ce que veut le PO, donc je considère que c'est (très) portable (et puis avec la mode la virtualisation en ce moment, pas la peine de faire trop les difficiles). Par contre, je ne connais pas cet entête, <dir.h>, qui n'est pas POSIX apparement.Envoyé par stephl
A bookmarker obligatoirement pour tout programmeur C :
http://www.unix.org/single_unix_specification
A+
C'est peut-être un fichier d'en-tête propre à Borland alors.Envoyé par Foobar1329
Non, on trouve dir.h sur différents systèmes Unix indépendament de Borland.
Alors je me suis penché un petit peu sur rmdir et remove alors le problème est que rmdir efface les dossiers vides donc il faut faire un recurcivité pour effacer le contenu du dossier. sinon j'ai vu qu'il y avait boost avec une fonction remove_all() mais ca m'embete de prendre une librairie pour faire un simple programme qui efface un dossier !!!!!!![]()
Re,
Surtout que boost est une bibliothèque C++ (c'est peut-être en C++ que tu programmes en même temps). La solution de souviron34 avec un system("rm -rf rep"); est alors envisageable pour faire au plus simple. Maintenant, quand la doc dit que remove() (rmdir()) ne sait qu'enlever des répertoires "vides", j'ai constaté sur plusieurs systèmes (RHL, RHEL, Solaris, AIX entre autres) que la fonction rmdir() savait détruire une arborescence de répertoires "vides" (i.e: que ., .., et éventuellement le nom d'un sous-répertoire ayant la même caractéristique) alors qu'elle est censée positionner errno à ENOTEMPTY d'après la (les) doc(s). A l'inverse, la commande rmdir ne sait détruire que des répertoires vraiment vides (il n'y a que . et ..). Bug de rmdir() ? Je ne sais pas, toujours est-il que le petit programme exemple suivant fonctionne très bien sur ma RHEL 4, RHL 9, ainsi que sur une Mandriva je sais pas quoi, de même qu'il doit fonctionner sur d'autres systèmes POSIX. Tous les fichiers n'étant pas des répertoires sont d'abord détruits dans l'arborescence avant de détruire le répertoire racine.Envoyé par Jérémy Lefevre
Si tu tiens vraiment à faire cette tâche par programmation d'une façon plus élaborée qu'un system(), je conseille d'aller jeter un oeil aux sources de rm et rmdir dans GNU fileutils par exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <dirent.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> int rcs_remove(char const * pathname) { int rc = 0; if (pathname) { DIR * dir = NULL; struct dirent * dp = NULL; struct stat statinfo; char name[1024+1] = { '\0' }; dir = opendir(pathname); if (dir) { if ( chdir(pathname) == -1) { fprintf(stderr, "Failed to chdir to %s\n", pathname); closedir(dir); exit(EXIT_FAILURE); } /* In this loop, recursive call to remove all files which are not directories */ while((dp = readdir(dir)) != NULL) { if (stat(dp->d_name, &statinfo) == -1) { fprintf(stderr, "stat() failed on %s\n", dp->d_name); closedir(dir); exit(EXIT_FAILURE); } if (S_ISDIR(statinfo.st_mode) && strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".") ) { size_t lgPath = strlen(pathname); size_t lgDirentry = strlen(dp->d_name); printf("I'm a directory: %s\n", dp->d_name); if ((lgPath+lgDirentry+1) <= 1024) { strcat(name, pathname); strcat(name,"/"); strcat(name, dp->d_name); } else { fprintf(stderr, "Pathname is too long !...Exiting\n"); closedir(dir); exit(EXIT_FAILURE); } printf("Directory: %s\n", name); rcs_remove(name); } else if (strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".") ) { printf("I'm another kind of file: %s ... Goodbye, I'm dying, this program removes me...\n", dp->d_name); rc = remove(dp->d_name); if (rc == -1) { perror("Remove failed"); exit(EXIT_FAILURE); } } } closedir(dir); /* Finally remove the empty root directory */ rc = remove(pathname); if (rc == -1) { perror("Remove failed"); exit(EXIT_FAILURE); } } } else { rc = -1; } return rc; } int main(void) { /* Copy and paste the following commands in your shell: cd ~ mkdir foo mkdir foo/bar mkdir foo/bar/foofoo mkdir foo/bar/foofoo/foobar echo "Java sucks \! My Eclipse still crashed 5 times today \!" > foo/bar/foofoo/me.txt echo "Not at all, Java is good for you" > foo/bar/foofoo/foobar/james.txt echo "Why? " >> foo/bar/foofoo/me.txt echo "Because you're too bad to program in C." >> foo/bar/foofoo/foobar/james.txt Check the directories tree with ls -Rl Compile and run this program. The files tree created above should have been deleted. */ rcs_remove("/home/<you>/foo"); return EXIT_SUCCESS; }
A+
Ceci peut être un bon exercice de style sous Linux que de faire tout ceci soi même, pour parcourir de façon récursive sous Linux, tu as les fonctions ftw et nftw pour t'aider un peu dans cette tâche. Il ne faut pas non plus oublier que le comportement de pas exemple rmdir et remove sont définies suivant l'implémentation et cela peut donc varier d'un Linux par exemple avec un système BSD ... à faire attention quand on les utilise alors![]()
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Partager