pb avec unlink et readdir

Le
Fabrice..Bacchella
Est-ce que quelqu'un peut me dire pourquoi le programme suivant, sur
Mac OS 10.3, n'est capable que d'effacer environ 170 fichiers alors
que si je commente le unlink, l'integralité du repertoire courant est
bien affiché ?

Le même programme compilé sur Solaris 9 passe comme une letre à la
poste.

Attention si vous voulez le tester, il efface tout les fichiers dans
le répertoire courant.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>

int main(int argc, char **argv)
{
int count = 0;
DIR *d = opendir(".");
if(!d) {
fprintf(stderr, "Can't open directory.");
return -1;
}
struct dirent *file_ent;

while(1) {
count++;
file_ent=readdir(d);
if(file_ent == NULL) {
fprintf(stderr,"End of directory");
break;
}
if(file_ent->d_name[0] != '.') {
unlink(file_ent->d_name);
}
}
closedir(d);
fprintf(stderr,"%d files seen", count);
return(0);
}


http://fba.homeip.net

http://fba.homeip.net
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pascal Bourguignon
Le #969783
Fabrice..Bacchella
Est-ce que quelqu'un peut me dire pourquoi le programme suivant, sur
Mac OS 10.3, n'est capable que d'effacer environ 170 fichiers alors
que si je commente le unlink, l'integralité du repertoire courant est
bien affiché ?


Si tu réfléchissais, en moins de temps que tu as mis pour écrire ce
news, tu aurais pu comprendre pourquoi ça ne marche pas!

Le même programme compilé sur Solaris 9 passe comme une letre à la
poste.


Chaque système gère ses répertoires comme il le veut. Solaris ne
tasse pas les entrées, HFS+ si, NFS aussi.

Attention si vous voulez le tester, il efface tout les fichiers dans
le répertoire courant.


Bin prend un argument!

#include #include #include #include #include
int main(int argc, char **argv)
{
int count = 0;
if(argc<2){
printf("usage:n%s directoryn",argv[0]);
return(1);
}
DIR *d = opendir(argv[1]);
if(!d) {
fprintf(stderr, "Can't open directory.n");
return -1;
}
struct dirent *file_ent;

while(1) {
count++;
file_ent=readdir(d);
if(file_ent == NULL) {
fprintf(stderr,"End of directoryn");
break;
}
if(file_ent->d_name[0] != '.') {
int ures;
char* buffer=malloc(strlen(argv[1])+strlen(file_ent->d_name)+2);
sprintf(buffer,"%s/%s",argv[1],file_ent->d_name);
printf("%sn",file_ent->d_name);
ures=unlink(buffer);
if(ures!=0){ perror("unlink:"); }
free(buffer);
}
}
closedir(d);
fprintf(stderr,"%d files seenn", count);
return(0);
}
/*** rm-all-files.c -- 2003-12-08 01:51:49 -- pascal ***/

--
__Pascal_Bourguignon__ . * * . * .* .
http://www.informatimago.com/ . * . .*
* . . / () . *
Living free in Alaska or in Siberia, a . . / . . * .
grizzli's life expectancy is 35 years, .*. / * . .
but no more than 8 years in captivity. . /* o .
http://www.theadvocates.org/ * '''||''' .
SCO Spam-magnet: ******************

Fabrice..Bacchella
Le #972930
On 08 Dec 2003 01:54:25 +0100, Pascal Bourguignon

Fabrice..Bacchella
Est-ce que quelqu'un peut me dire pourquoi le programme suivant, sur
Mac OS 10.3, n'est capable que d'effacer environ 170 fichiers alors
que si je commente le unlink, l'integralité du repertoire courant est
bien affiché ?


Si tu réfléchissais, en moins de temps que tu as mis pour écrire ce
news, tu aurais pu comprendre pourquoi ça ne marche pas!

Le même programme compilé sur Solaris 9 passe comme une letre à la
poste.


Chaque système gère ses répertoires comme il le veut. Solaris ne
tasse pas les entrées, HFS+ si, NFS aussi.

Attention si vous voulez le tester, il efface tout les fichiers dans
le répertoire courant.


Bin prend un argument!


À part des injures, ce que vous essayez de me dire c'est que les
fonctions readdirs ne sont pas adapté à un usage sur HFS. Donc Apple
n'a pas tout à fait fini le portage de ces appels pour garantire un
fonctionnement cohérent indépendant du système de fichiers
sous-jacent.

En fonction de cette hypothèse, j'ai fait quelques tests. Les
resultats sont assez surprenant :
NFS de Solaris vers Solaris fonctionne
NFS de Mac OS X vers Solaris ne fonctionne pas, même si la limite est
cette fois porté à un millier.
NFS de Solaris vers Mac OS X HFS+ : on retombe sur la limite à moins
de 200.
NFS de Solaris vers Mac OS X UFS : on retombe sur la limite à moins de
200.

UFS sur Mac OS X : OK

HFS joue donc un rôle la dedans, mais Mac OS X aussi. Est-ce que
quelqu'un à les mêmes résultat avec un autre Unix ou c'est moi qui
délire ?
---
http://fba.homeip.net


Publicité
Poster une réponse
Anonyme