Langage c: déplacement dans un répertoire

Résolu/Fermé
moi411 - 29 juil. 2005 à 02:45
 kurtcob.1967 - 1 déc. 2010 à 01:46
Bonjour à tous,
J'essaye de faire une barre de progression en langage C (un peu comme dans le poste de travail quand on copie des fichiers).
Mais j'ai un petit soucis: comment faire pour connaitre la taille d'un répertoire (je suppose que la copie ou la suppression de fichiers se fait grace à la taille et non avec le nombre de fichiers...).
J'ai essayé bêtement avec une fonction fopen mais elle ne sert qu'a ouvrir un fichier dans un répertoire et non le répertoire tout court (ou alors j'ai besoin d'aide!!!).

J'ai ensuite essayé avec le nombre de fichiers mais même problème: comment faire, cette fois,pour trouver le nombre de fichiers du répertoire... Pour ne pas dire d'avoir perdu mon temps j'ai fait un programme dans lequel je doit rentrer le nombre de fichier à copier au clavier:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
int x=954783; //nombre de fichiers à copier
int i=0; //indique quel fichier est copié
int j; //pourcentage de fichiers copiés


printf("Entrez le nombre de fichier a copier: ");
scanf("%d",&x);

while(i<=x)
{
gotoxy(5,14);
j=(i*100)/x;
if((j%5)==0)
{
gotoxy(i,4);
printf("|");
gotoxy(5,15);
printf("%d%",j);
}

i++;
}

printf("\n\n");
system("pause");
}

Pour faire court ma principale question est: comment on fait pour se déplacer dans un répertoire, en trouver le nombre de fichiers etc. en langage C?

Voila j'espère que je me suis bien expliqué et je vous remercie d'avance. A plus tard.
A voir également:

8 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
30 juil. 2005 à 01:46

SYNOPSIS
       #include <sys/types.h>

       #include <dirent.h>

       struct dirent *readdir(DIR *dir);

DESCRIPTION
       The readdir() function returns a pointer to a dirent structure representing the next
       directory entry in the directory stream pointed to  by  dir.   It  returns  NULL  on
       reaching the end-of-file or if an error occurred.

       On Linux, the dirent structure is defined as follows:

         struct dirent {
             ino_t          d_ino;       /* inode number */
             off_t          d_off;       /* offset to the next dirent */
             unsigned short d_reclen;    /* length of this record */
             unsigned char  d_type;      /* type of file */
             char           d_name[256]; /* filename */
         };

       According  to POSIX, the dirent structure contains a field char d_name[] of unspeci-
       fied size, with at most NAME_MAX characters preceding the terminating  null  charac-
       ter.   POSIX  1003.1-2001  also documents the field ino_t d_ino as an XSI extension.
       Use of other fields will harm the portability of your programs.

       The data returned by readdir() may be overwritten by subsequent calls  to  readdir()
       for the same directory stream.

RETURN VALUE
       The  readdir() function returns a pointer to a dirent structure, or NULL if an error
       occurs or end-of-file is reached.  On error, errno is set appropriately.


Qu'est ce qu'il te faut de plus ?
2
ch_viaud Messages postés 2 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 22 septembre 2006 2
22 sept. 2006 à 14:45
Presque 2 mois... tu as du te débrouiller...
Enfin, pour que ce post puisse servir à d'autre, il faut quand même ajouter qu'il n'y a pas de standard C multi-plateforme concernant la gestion des répertoires (ou bien qu'on me dise lequel, je le cherche depuis une semaine...)

Coté Microsoft, on utilise les fonctions "_findfirst", "_findnext" et "_findclose", et il est possible d'utiliser des caractères "joker" pour ne récupérer que les certains fichiers.

Coté Unix et consorts, on utilise les fonctions "opendir", "readdir", et "closedir" (contenues dans <dirent.h>).

Principales différences (en plus de la syntaxe) :
* pas de possibilité d'utiliser les "joker" avec Unix
* "_findfirst" ouvre un flux et renvoi la première entrée du répertoire, alors que "opendir" ne fait qu'ouvrir le flux.
* à part le nom des fichiers, "readdir" ne renvoit pas grand chose comme info (pour ainsi dir : rien d'intéressant), alors que les fonctions implémentées par Microsoft renvoient la taille, les attributs...

J'ai trouvé là (mail-archives.apache.org) un source pour le monde Dos/Windows qui implémente les fonctions Unix (mais qui évidemment perd au passage la possibilité de filtrer et de récupérer les attributs des fichiers)
1
ch_viaud Messages postés 2 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 22 septembre 2006 2
22 sept. 2006 à 14:47
Presque 2 mois... tu as du te débrouiller...
Enfin, pour que ce post puisse servir à d'autre, il faut quand même ajouter qu'il n'y a pas de standard C multi-plateforme concernant la gestion des répertoires (ou bien qu'on me dise lequel, je le cherche depuis une semaine...)

Coté Microsoft, on utilise les fonctions "_findfirst", "_findnext" et "_findclose", et il est possible d'utiliser des caractères "joker" pour ne récupérer que les certains fichiers.

Coté Unix et consorts, on utilise les fonctions "opendir", "readdir", et "closedir" (contenues dans <dirent.h>).

Principales différences (en plus de la syntaxe) :
* pas de possibilité d'utiliser les "joker" avec Unix
* "_findfirst" ouvre un flux et renvoi la première entrée du répertoire, alors que "opendir" ne fait qu'ouvrir le flux.
* à part le nom des fichiers, "readdir" ne renvoit pas grand chose comme info (pour ainsi dir : rien d'intéressant), alors que les fonctions implémentées par Microsoft renvoient la taille, les attributs...

J'ai trouvé là (mail-archives.apache.org) un source pour le monde Dos/Windows qui implémente les fonctions Unix (mais qui évidemment perd au passage la possibilité de filtrer et de récupérer les attributs des fichiers)
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
29 juil. 2005 à 13:33
Salut,

Je pense que cette page repondra à quelques unes de tes questions:
http://c.developpez.com/faq/c/?page=fichiers
0

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

Posez votre question
Salut,
En fait ça pourrait répondre à mes question mais je n'arrive pas à utilliser les fonctions qui y sont présentes, quelles librairies utiliser, que sont les hSearch...
Les deux fonctions qui me serviraient sont d'abord:


(avec une erreur à la compilation sur hSearch=FindFirstFile... il met undefined symbol hSearch)

WIN32_FIND_DATA File;
HANDLE hSearch;
BOOL re;

hSearch=FindFirstFile("*.*", &File);
if(hSearch == INVALID_HANDLE_VALUE){
return FALSE;
}

re=TRUE;
do {
/* Traitement */
re = FindNextFile(hSearch, &File);
} while(re);

FindClose(hSearch);
return TRUE;


et ensuite:

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


main()
{
struct dirent *lecture;
DIR *rep;
rep = opendir("/tmp");
while ((lecture = readdir(rep))) {
printf("FICHIER: %s\n", lecture->d_name);
}
closedir(rep);
}

cette fonction se compile bien mais elle ne s'exécute pas...

ensuite pour la taille je n'ai pas encore essayer mais je vais m'y mettre... Si tu pouvais m'aider encore un peu se serai sympa, merci.
0
while ((lecture = readdir(rep))!=null)
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 juil. 2005 à 21:18
Pour la barre de progression :
#include <iostream>
using namespace std;

void sablier(unsigned int compteur,unsigned int max){
    unsigned int i,largeur_char=80;
    static unsigned int progression=0;

    //Dessin de la barre de progression
    cout.flush();
    cout << "("<<compteur<<"/"<<max<<")";
    if (max==0 || compteur>max || ((largeur_char*compteur)/max<=progression) ){
        cout << "\r";
        return;
    }
    cout << "[";
    for(i=0;i<(largeur_char*compteur)/max;i++) cout << "=";
    progression=i;
    if (i<largeur_char) cout << ">";
    for(;i<largeur_char-1;i++) cout << " ";
    cout << "]\r";

    //Barre remplie
    if (compteur==max){
        cout << endl;
        progression=0;
    }
}

avec 0<compteur<max

Bonne chance
0
Re,
c'est bien sympa mais pour le moment j'ai un autrte problème qui, à mon avis va faire rigoler, c'est juste pour ouvrir un dossier (en mode binaire) et travailler dedans...
sinon pour la barre de progression, je ne comprends pas bien parce que je n'ai jamais fait de c++, je garde le code quand-même pour plus tard!!!

le code est ici:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

FILE *fd;
FILE *fichier;

long fsize()
{
long savepos, size;
savepos=ftell(fd);
fseek(fd,0,SEEK_END);
size=ftell(fd);
fseek(fd,savepos,SEEK_SET);
return size;

}

int main()
{
fichier=fopen("c:\\docs","rb"); //docs étant un dossier et non un
// fichier

if(fichier==NULL) printf("erreur");
else printf("c'est bon (fichier ouvert)");

printf("%d",fsize());

printf("\n\n\n");
system("pause");
}

Si qqun peut m'aider je serai content... Merci
0
Re,
Ce qu'il me faut de plus? Bah que mon programme marche!!! Je ne peux m'en predre qu'à moi si ce n'est pas le cas, je le sais. Mais en l'occurence j'ai besoin d'aide et ce que tu me montre, je ne sais pas ce que ça veut dire...
J'ai trouvé une fonction qui peut m'aider mais je n'arrive pas à ouvrir mon répertoire et donc à savoir si cette fonction m'est utile ou pas.

Je ne veut pas une solution toute faites mais seulement une petite aide, parce que je ne sais pas ou je me suis trompé...

Le code que j'ai envoyé juste avant va me permètre de continuer mon programme mais si je n'arrive pas à rentrer dans le répertoire je ne pourrait le faire. Ce petit bout de code doit juste me servir à trouver la taille du répertoire...

Enfin voilà c'est tout ce que je demande, pour la barre de preogression je vais essayer de comprendre ce que tu as mis mais je ne promet rien (pour l'instant je n'ai étudié que le langage C)

Enfin sinon je te souhaites une bonne nuit quand-même et encore une fois je demande une petite aide!!! A plus.
0