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
| #include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
/*
Concevez un programme C qui reçoit comme argument le nom dun répertoire et con-
struit dans son répertoire courant un fichier darchive dont le nom est celui du réper-
toire reçu en argument suivi de ".arch" et qui contient tous les fichiers ordinaires du
répertoire dont il a reçu le nom ainsi que les informations relatives à ces fichiers, afin
de permettre ultérieurement de reconstituer le répertoire avec ses fichiers et leurs
attributs. Si le répertoire courant contient des sous répertoires, chacun de ceux-ci sera
stocké dans un fichier darchives distinct.
*/
/*
struct dirent {
ino_t d_ino; // numéro de linode
off_t d_off; //décalage vers le prochain dirent
unsigned short d_reclen; // longueur de cet enregistrement
unsigned char d_type; // type du fichier
char d_name[256]; // nom du fichier
};
*/
int browseDirectory (char* name, char* fileName)
{
unlink(fileName);
DIR * myDirectory = opendir(name);
FILE * myFile = fopen (fileName, "a+");
// On teste l'ouverture du dossier
if (myDirectory == NULL)
{
printf ("Erreur lors de l'ouverture du dossier\n");
return -1;
}
// On teste l'ouverture du fichier
if (myFile == NULL)
{
printf ("Erreur lors de l'ouverture du dossier\n");
return -2;
}
// On initialise la structure
struct dirent * currentFile = readdir(myDirectory);
char* tmpDirectoryName = (char*)malloc(sizeof(char) * 1000);
// On fait la boucle tant qu'on est pas à la fin du dossier
while (currentFile != NULL)
{
// On ignore le dossier courant et le dossier parent
if (strcmp(currentFile->d_name, ".") != 0 && strcmp(currentFile->d_name, "..") != 0)
{
sprintf(tmpDirectoryName, "%s/%s", name, currentFile->d_name);
// Si c'est un dossier
if (opendir(tmpDirectoryName) != NULL)
{
char* tmpFileName = (char*)malloc(sizeof(char) * 1000);
sprintf(tmpFileName, "%s.arch", currentFile->d_name);
browseDirectory (tmpDirectoryName, tmpFileName);
free(tmpFileName);
}
else
{
// On écrit dans le fichier
fprintf(myFile, "%s\n", currentFile->d_name, currentFile->d_type);
}
}
// On passe au fichier suivant
currentFile = readdir(myDirectory);
}
// On ferme le fichier & le dossier
fclose(myFile);
closedir(myDirectory);
return 0;
}
int main()
{
browseDirectory("/home/e3kiel/C", "test.arch");
} |
Partager