#include #include #include struct SecteurFichier { int donnee; int secteur_suivant; // Pointeur vers le secteur suivant du même fichier (-1 si la fin du fichier) }; struct Fichier { char nom[2]; int premier_secteur; // Pointeur vers le premier secteur du fichier (-1 si le fichier est vide) }; struct Fichier fichiers[100]; // Tableau de fichiers struct SecteurFichier disque[100]; // Tableau de secteurs de fichiers int capacite_disque = 100; // Capacité totale du disque int espace_libre = 100; // Espace libre dans le disque (initialisée à la capacité) int nb_fichiers = 0; int verifierNomUnique(struct Fichier 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 Fichier fichiers[], struct SecteurFichier disque[], int *nb_fichiers, int *espace_libre, int capacite_disque) { 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 : "); int taille_fichier; scanf("%d", &taille_fichier); if (taille_fichier <= (*espace_libre + 1)) { int secteur_actuel = 0; int secteur_vide_actuel = -1; int nb_secteur_enregistree = 0; while (secteur_actuel < capacite_disque && nb_secteur_enregistree < taille_fichier) { if (disque[secteur_actuel].donnee == 0) { if (secteur_vide_actuel == -1) { secteur_vide_actuel = secteur_actuel; disque[secteur_vide_actuel].donnee = 1; fichiers[*nb_fichiers].premier_secteur = secteur_actuel; } else { disque[secteur_vide_actuel].secteur_suivant = secteur_actuel; disque[secteur_actuel].donnee = 1; //printf("Secteur suivant %d:\n", disque[secteur_vide_actuel].secteur_suivant); secteur_vide_actuel = secteur_actuel; } nb_secteur_enregistree++; } secteur_actuel++; } *espace_libre -= taille_fichier; printf("Fichier \"%s\" de taille %d alloué à partir du secteur %d.\n", fichiers[*nb_fichiers].nom, taille_fichier, fichiers[*nb_fichiers].premier_secteur); (*nb_fichiers)++; return; } else { printf("Espace disque insuffisant pour allouer le fichier.\n"); } } else { printf("Trop de fichiers sur le disque.\n"); } } void supprimerFichier(struct Fichier fichiers[], struct SecteurFichier disque[], int *nb_fichiers, int *espace_libre) { char nom_fichier[2]; 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é int secteur_actuel = fichiers[index].premier_secteur; int secteur_suivant = disque[secteur_actuel].secteur_suivant; // Marquer les secteurs comme libres disque[secteur_actuel].donnee = 0; disque[secteur_actuel].secteur_suivant = -1; int taille = 1; while (secteur_suivant != -1) { disque[secteur_suivant].donnee = 0; secteur_actuel = secteur_suivant; secteur_suivant = disque[secteur_suivant].secteur_suivant; disque[secteur_actuel].secteur_suivant = -1; taille++; } // Décaler les fichiers suivants vers l'arrière for (int i = index; i < *nb_fichiers - 1; i++) { fichiers[i] = fichiers[i + 1]; } *espace_libre += taille; (*nb_fichiers)--; printf("Fichier \"%2s\" supprimé avec succès.\n", nom_fichier); } else { printf("Fichier non trouvé ou déjà supprimé.\n"); } } void afficherEtatDisque(struct Fichier fichiers[], struct SecteurFichier disque[], int nb_fichiers, int capacite_disque) { printf("État du disque avec les noms des fichiers ou # pour les secteurs vides :\n"); int secteur_actuel = 0; int secteur_suivant = -1; while (secteur_actuel < capacite_disque) { if (disque[secteur_actuel].donnee == 1) { int i = 0; int continuer = 1; while (i