#include #include #include struct INode { char nom[2]; // Metadata:: Nom du fichier int taille; // Metadata:: Taille du fichier int *secteurs; // Pointeur vers les secteurs du fichier }; struct INode fichiers[100]; int disque[100]; int nb_fichiers = 0; int capacite_disque = 100; // Capacité totale du disque int espace_libre = 100; // Espace libre dans le disque (initialisée à la capacité) int verifierNomUnique(struct INode fichiers[], int nb_fichiers, char nom[]) { for (int i = 0; i < nb_fichiers; i++) { if (strcmp(fichiers[i].nom, nom) == 0) { return 0; // Le nom existe déjà } } return 1; // Nom unique } void creerFichier(struct INode fichiers[], int disque[], int *nb_fichiers, int *espace_libre) { if (*nb_fichiers < 100) { char nom[2]; int nom_valide = 0; while (!nom_valide) { printf("Nom du fichier (2 caractères) : "); scanf("%2s", nom); if (verifierNomUnique(fichiers, *nb_fichiers, nom)) { nom_valide = 1; } else { printf("Ce nom de fichier existe déjà. Veuillez en choisir un autre.\n"); } } strcpy(fichiers[*nb_fichiers].nom, nom); printf("Taille du fichier : "); scanf("%d", &fichiers[*nb_fichiers].taille); if (fichiers[*nb_fichiers].taille <= *espace_libre) { // Allouer les secteurs pour le fichier fichiers[*nb_fichiers].secteurs = (int *)malloc(fichiers[*nb_fichiers].taille * sizeof(int)); int secteurs_alloues = 0; for (int i = 0; i < 100 && secteurs_alloues < fichiers[*nb_fichiers].taille; ++i) { if (disque[i] == 0) { // Vérifier si le secteur est vide fichiers[*nb_fichiers].secteurs[secteurs_alloues++] = i; disque[i] = 1; *espace_libre -= 1; // Réduire la taille du disque } } printf("Fichier \"%s\" de taille %d alloué avec succès.\n", fichiers[*nb_fichiers].nom, fichiers[*nb_fichiers].taille); (*nb_fichiers)++; } else { printf("Espace disque insuffisant pour allouer le fichier.\n"); } } else { printf("Trop de fichiers sur le disque.\n"); } } void supprimerFichier(struct INode fichiers[], int disque[], int *nb_fichiers, int *espace_libre) { if (*nb_fichiers > 0) { char nom_fichier[3]; printf("Nom du fichier à supprimer : "); scanf("%2s", nom_fichier); int index = -1; for (int i = 0; i < *nb_fichiers; i++) { if (strcmp(nom_fichier, fichiers[i].nom) == 0) { index = i; break; } } if (index != -1) { // Libérer l'espace du fichier supprimé for (int i = 0; i < fichiers[index].taille; i++) { disque[fichiers[index].secteurs[i]] = 0; *espace_libre += 1; // Augmenter la taille du disque } // Réallouer la mémoire pour les secteurs free(fichiers[index].secteurs); // Décaler les fichiers suivants vers l'arrière for (int i = index; i < *nb_fichiers - 1; i++) { fichiers[i] = fichiers[i + 1]; } (*nb_fichiers)--; printf("Fichier \"%s\" supprimé avec succès.\n", nom_fichier); } else { printf("Fichier non trouvé ou déjà supprimé.\n"); } } else { printf("Aucun fichier sur le disque.\n"); } } void afficherEtatDisque(struct INode fichiers[], int disque[], int nb_fichiers) { printf("État du disque avec les noms des fichiers ou # pour les secteurs vides :\n"); for (int i = 0; i < 100; ++i) { int secteur_occupe = 0; for (int j = 0; j < nb_fichiers; ++j) { for (int k = 0; k < fichiers[j].taille; ++k) { if (fichiers[j].secteurs[k] == i) { printf("%s ", fichiers[j].nom); secteur_occupe = 1; break; } } if (secteur_occupe) { break; } } if (!secteur_occupe) { printf("## "); } if (i % 10 == 9) { printf("\n"); } } } int main() { // intialisation de disque for (int i=0; i<100; i++) disque[i] = 0; int choix; do { printf("\nMenu :\n"); printf("1. Créer un fichier\n"); printf("2. Supprimer un fichier\n"); printf("3. Afficher l'état du disque\n"); printf("4. Quitter\n"); printf("Choix : "); scanf("%d", &choix); switch (choix) { case 1: creerFichier(fichiers, disque, &nb_fichiers, &espace_libre); break; case 2: supprimerFichier(fichiers, disque, &nb_fichiers, &espace_libre); break; case 3: afficherEtatDisque(fichiers, disque, nb_fichiers); break; case 4: printf("Au revoir.\n"); break; default: printf("Choix invalide.\n"); } } while (choix != 4); // Libérer la mémoire allouée pour les secteurs for (int i = 0; i < nb_fichiers; i++) { free(fichiers[i].secteurs); } return 0; }