Rechercher : dans
Par :

Langage c: déplacement dans un répertoire

Dernière réponse le 22 sep 2006 à 14:47:27 moi411, le 29 jui 2005 à 02:45:08 
 Signaler ce message aux modérateurs

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.

Meilleures réponses pour « langage c: déplacement dans un répertoire » dans :
Langage C++ - Les types de données Voir Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

kilian, le 29 jui 2005 à 13:33:02

Salut,

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

Répondre à kilian

2

moi411, le 29 jui 2005 à 20:26:04

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.

Répondre à moi411

3

mamiemando, le 29 jui 2005 à 21:18:33

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

Répondre à mamiemando

4

moi411, le 29 jui 2005 à 23:34:51

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

Répondre à moi411

5

mamiemando, le 30 jui 2005 à 01:46:25
  • +1


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 ?

Répondre à mamiemando

6

moi411, le 30 jui 2005 à 02:50:17

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.

Répondre à moi411

7

ch_viaud, le 22 sep 2006 à 14:45:57

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)

Répondre à ch_viaud

8

 ch_viaud, le 22 sep 2006 à 14:47:27

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)

Répondre à ch_viaud
Collection CommentÇaMarche.net