Gestion de fichier et dossier + autres

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 106 fois - Téléchargée 17 fois

Contenu du snippet

Petit code qui permet de gérer les fichiers et dossiers ainsi que d'autres fonctions.
Je suis débutant, il manque beaucoup de chose mais cela donnera une base pour ceux qui veulent étudier le fonctionnement d'un os. Bien sur quand je parle os il faut relativiser ^^.

Source / Exemple :


#include <string.h>
#include <string>
#include <time.h>
#include "types.h"

using namespace std;

void initArrayRecord(rootDirectory  arrayRecord[1024]);
void initArrayRecord(dataSection arrayRecord[1024]);
char text [512];
int numéro = 99;
int incrementation = 0;
int kb ;
void main()
{

	// la limite de compilation impose une taille raisonnées dans la limite des tableaux
	rootDirectory rootDirectoryArrayRecord[1024]; // tableau enregistrement de rootDirectory
	dataSection dataSectionArrayRecord[1024]; // // tableau enregistrement de dataSection

	char commande[255]; // commande passée

	// initialisation des structures
	initArrayRecord(rootDirectoryArrayRecord);
	while ( strcmp(commande,"exit") != 0 )
	{
		printf("? >");
		gets(commande);
		time_t *h=NULL;
		time_t t;
		if (strcmp(commande,"ver") == 0 )
		{
			printf("version 0.1 \n");

		}
		if (strcmp(commande,"date") == 0 )
		{

			int j = 0;
			char date[255];
			char realDate[255];
			char realYear[5];
			time_t rawtime;
			t = time ( &rawtime );
			sprintf(date,"%s",asctime(localtime(&t)));
			strncpy(realDate,date,10);
			realDate[10] = '\0';
			j=0;
			for (int i  =20 ; i <strlen(date)-1; i++)
			{
				realYear[j] = date[i];
				j++;
			}
			realYear[j] = '\0';
			sprintf(realDate,"%s-%s",realDate,realYear);
			printf("date : %s \n",realDate);

		}
		if (strcmp(commande,"time") == 0 )
		{

			int j = 0;
			char date[255];
			char realHour[255];

			time_t rawtime;
			t = time ( &rawtime );
			sprintf(date,"%s",asctime(localtime(&t)));
			j=0;
			for (int i =11 ; i <20; i++) // prototype  à vérifier pour les positions
			{
				realHour[j] = date[i];
				j++;
			}
			realHour[j] = '\0';
			printf("heure : %s \n",realHour);

		}

		///////////////////////////creation de fichier

		if (commande[0] == 'e' && commande[1] == 'd' && commande[2] == 'i' && commande[3] == 't' )
		{

			char nom[255];
			int j = 0;
			int position;
			int longueur = strlen(commande);
			for (int i = 5; i< longueur; i++)
			{
				nom[j] = commande[i];
				j++;
			}
			nom[j]='\0';
			printf("nom fichier %s \n",nom);
			char extension[4];
			for (int i = 0; i < strlen(nom); i++)
			{
				if ( nom[i] == '.')
				{
					position = i;
					i = 99;
				}
			}
			j= 0;
			for (int i = position+1; i< strlen(nom); i++)
			{
				extension[j] = nom[i];
				j++;
			}
			extension[j]='\0';
			numéro++;
			incrementation ++;
			printf("ext fichier %s \n",extension);
			rootDirectoryArrayRecord[numéro].rdID = numéro;// identifiant 0 à 99 réservés
			strcpy (rootDirectoryArrayRecord[numéro].rdName , nom); // ajout de nom
			strcpy (rootDirectoryArrayRecord[numéro].rdExtension , extension);// extension
			dataSectionArrayRecord[incrementation].dsID , incrementation; /// ID avec varriable incrementation pour le Fichier
			rootDirectoryArrayRecord[numéro].rdFirstSecor , incrementation; /// Id avec varriable incrementation pour l'emplacement du contenu
			rootDirectoryArrayRecord[numéro].rdType = 1;
			printf("Contenu du fichier : \n"); 
			gets(text);
			strcpy(dataSectionArrayRecord[incrementation].dsData , text);  //inserion du contenu dans la section data en recupérant l id
			kb = strlen(text);
			rootDirectoryArrayRecord[numéro].rdSize = kb;
			printf("taille : %d kb\n",kb);
			//insertion du poid en KB avec le nbr de char
			if (strcmp (dataSectionArrayRecord[incrementation].dsData , text) ==0)
			{
				printf("Enregistrement ok\n");
			}
			else  
			{
				printf(" Error de l'enregistrement\n");
			}
			printf("Quelle dossier ?\n");
			/////////recherche du dossier ///////
			gets(text);
			int j1 = 0;
			for (int i = 0; i< 1024; i++)
			{ 
				if (strcmp(rootDirectoryArrayRecord[i].rdName, text) ==0)
				{
					j1=i; //// id du dossier 
					i=1025;
					printf("dossier trouver \n");
					printf("Enregistrement total \n");
				}
				if (i == 1023)
				{
					printf(" Dossier introuvable\n");
					printf(" Enregistrement partielle \n");
				}
			}

			rootDirectoryArrayRecord[numéro].rdParent = j1; //// Le fichier prend la valeur de l id du dossier dans lequelle on l'ajoute

		}

		///////////////////////////////////////////////////////////////////////////////////
		/////////////  Création de dossier ////////////////////

		if (commande[0] == 'm' && commande[1] == 'k' && commande[2] == 'd' && commande[3] == 'i' && commande[4] == 'r')
		{
			numéro ++;
			char nom[255];
			int j = 0;
			int position;
			int longueur = strlen(commande);
			for (int i = 6; i< longueur; i++)
			{
				nom[j] = commande[i];
				j++;
			}
			nom[j]='\0';
			printf("nom dossier %s \n",nom);
			rootDirectoryArrayRecord[numéro].rdID = numéro;// id de rootdirectory
			rootDirectoryArrayRecord[numéro].rdType = 0;
			strcpy (rootDirectoryArrayRecord[numéro].rdName , nom);  /// affectation du nom du dossier
			if (strcmp (rootDirectoryArrayRecord[numéro].rdName , nom)==0)
			{
				printf("Enregistrement ok\n");
				printf("id = %d\n", numéro);
			}
			else  
			{
				printf(" Error de l'enregistrement");
			}

		}
		///////////////////// Dir ////////////////////
		int numero2 =0;
		int IDdossier;
		char name [250];
		char namedossier [250];
		if (strcmp(commande,"dir") == 0 )
		{

			for (int i=99; i< 1024;i++)
			{
				rootDirectoryArrayRecord[i].rdScan = 0;

			}
			for (int i=99; i< 1024;i++)
			{
				if (( rootDirectoryArrayRecord[i].rdScan == 0) && (rootDirectoryArrayRecord[i].rdType == 1 )
					&& (rootDirectoryArrayRecord[i].rdID != 0 )) // si c'est un fichier et qu'il n'a pas ete scan et qu'il a bien un ID

				{
					IDdossier = rootDirectoryArrayRecord[i].rdParent; //recupérartion de l'id du dossier
					strcpy (name , rootDirectoryArrayRecord[IDdossier].rdName);
					printf ("le nom du dossier est %s \n",name);
					//scan des fichier ayant le meme nom que l'association IDname
					for (int y=99; y< 1024;y++)
					{
						if (( rootDirectoryArrayRecord[y].rdScan == 0) && (rootDirectoryArrayRecord[y].rdType == 1 )
							&& (rootDirectoryArrayRecord[y].rdID != 0 ) && (rootDirectoryArrayRecord[y].rdParent == IDdossier))
						{
							strcpy (namedossier , rootDirectoryArrayRecord[y].rdName);
							printf ("   le nom du fichier est %s \n",namedossier);
							rootDirectoryArrayRecord[y].rdScan = 1;
						}
					}

				}

			} 	

		}
		////////////////////// cat ///////////////////////////
		if (commande[0] == 'c' && commande[1] == 'a' && commande[2] == 't')
		{
			numéro ++;
			char nom[255];
			int j = 0;
			int position;
			int longueur = strlen(commande);
			int id;
			int poid;
			int iddossier;
			char nomdossier [250];
			for (int i = 4; i< longueur; i++)
			{
				nom[j] = commande[i];
				j++;
			}
			nom[j]='\0';
			printf("nom fichier %s \n",nom);
			for (int i =99; i<1024; i++)
			{
				if (strcmp(rootDirectoryArrayRecord[i].rdName, nom) ==0)
				{
					id = rootDirectoryArrayRecord[i].rdID;
					printf("id du fichier est %d\n",id);
					poid = rootDirectoryArrayRecord[i].rdSize;
					printf("le poid du fichier est %d kb\n",poid);
					iddossier = rootDirectoryArrayRecord[i].rdParent;
					strcpy(nomdossier , rootDirectoryArrayRecord[iddossier].rdName);
					printf("Il est dans le dossier %s\n",nomdossier);
				}
			}
		}
		////////////////////////////// defrag ////////////////////////////:
		if (strcmp(commande,"defrag") == 0 )

		{
			for (int i = 98; i < 1024;i++)
			{
				if (strcmp (rootDirectoryArrayRecord[i].rdName , "")==0)
				{ 
					char name2 [250];
					char extens [250];
					int sector; // Emplacement du contenu
					int type;
					int size;
					int id;
					int parent;
					int inc =0;
					int j=0;
					j = i;
					while ( strcmp (rootDirectoryArrayRecord[j].rdName , "")==0) // Nombre de place vide aprés l'id 
					{
						j++;
					}
					if ( rootDirectoryArrayRecord[j].rdType == 1) // Travail sur les fichier
					{
						///sauvegardes des valeurs
						strcpy (name2 , rootDirectoryArrayRecord[j].rdName);
						strcpy (extens , rootDirectoryArrayRecord[j].rdExtension);
						sector = rootDirectoryArrayRecord[j].rdFirstSecor;
						type = rootDirectoryArrayRecord[j].rdType;
						size = rootDirectoryArrayRecord[j].rdSize;
						parent = rootDirectoryArrayRecord[j].rdParent;
						///suppresion des donnée
						rootDirectoryArrayRecord[j].rdID  = 0;
						strcpy(rootDirectoryArrayRecord[j].rdName,"");
						strcpy(rootDirectoryArrayRecord[j].rdExtension,"");
						rootDirectoryArrayRecord[j].rdType = 2;
						rootDirectoryArrayRecord[j].rdSize = 0;
						rootDirectoryArrayRecord[j].rdTime = 0;
						rootDirectoryArrayRecord[j].rdDate = 0;
						rootDirectoryArrayRecord[j].rdFirstSecor = 0;
						rootDirectoryArrayRecord[j].rdParent = 0;
						rootDirectoryArrayRecord[j].rdAttrib = 0;
						/// réatribution des données
						rootDirectoryArrayRecord[i].rdID = i;
						strcpy (rootDirectoryArrayRecord[i].rdName , name2);
						strcpy (rootDirectoryArrayRecord[i].rdExtension , extens);
						rootDirectoryArrayRecord[i].rdFirstSecor = sector;
						rootDirectoryArrayRecord[i].rdType = type;
						rootDirectoryArrayRecord[i].rdSize = size;
						rootDirectoryArrayRecord[i].rdParent = parent;
						printf(" le Fichier %s ayant l'id %d a ete déplacer a l'id %d\n",name2,j,i);
					}
					if ( rootDirectoryArrayRecord[j].rdType == 0) // travail sur les dossier
					{
						// sauvegarde des données
						id = rootDirectoryArrayRecord[j].rdID;
						strcpy (name2 , rootDirectoryArrayRecord[j].rdName);
						type = rootDirectoryArrayRecord[j].rdType;
						// suppression des données
						strcpy(rootDirectoryArrayRecord[j].rdName,"");
						type = rootDirectoryArrayRecord[j].rdType;
						//réatribution des données
						rootDirectoryArrayRecord[i].rdID = i;
						strcpy (rootDirectoryArrayRecord[i].rdName , name2);
						rootDirectoryArrayRecord[i].rdType = type;
						printf(" le Dossier %s ayant l'id %d a ete déplacer a l'id %d\n",name2,j,i);
						for (j = 99; j<1024; j++)
						{
							if (rootDirectoryArrayRecord[j].rdParent = id)
							{
								rootDirectoryArrayRecord[j].rdParent = i;
							}
						}
					}

				}
				if (strcmp (dataSectionArrayRecord[i].dsData,"")) ////travail sur les données
				{
					int j;
					int id;
					char contenu2[512];
					j = i;
					while (strcmp (dataSectionArrayRecord[j].dsData ,"")) // Nombre de place vide aprés l'id 
					{
						j++;
					}
					id = dataSectionArrayRecord[j].dsID;
					strcpy (contenu2 , dataSectionArrayRecord[j].dsData);
					//suppresion des données
					dataSectionArrayRecord[i].dsID = 0;
					strcpy(dataSectionArrayRecord[i].dsData,"");
					//reatribution des données
					dataSectionArrayRecord[i].dsID = i;
					strcpy (dataSectionArrayRecord[i].dsData , contenu2);
					for(j=99; j<1024;j++)
					{
						if (rootDirectoryArrayRecord[j].rdFirstSecor == id)
						{
							rootDirectoryArrayRecord[j].rdFirstSecor = i;
						}
					}
				}
			}
		}
		/////////////////////delf///////////////////
		if (commande[0] == 'd' && commande[1] == 'e' && commande[2] == 'l' && commande[3] == 'f' )
		{

			char nom[255];
			int sector;
			int j = 0;
			int position;
			int longueur = strlen(commande);
			for (int i = 5; i< longueur; i++)
			{
				nom[j] = commande[i];
				j++;
			}
			nom[j]='\0';
			for (j =99 ; j<1024; j++)
			{
				if ((strcmp (rootDirectoryArrayRecord[j].rdName , nom)==0) && (rootDirectoryArrayRecord[j].rdType == 1))
				{
					sector = rootDirectoryArrayRecord[j].rdFirstSecor;
					rootDirectoryArrayRecord[j].rdID  = 0;
					strcpy(rootDirectoryArrayRecord[j].rdName,"");
					strcpy(rootDirectoryArrayRecord[j].rdExtension,"");
					rootDirectoryArrayRecord[j].rdType = 2;
					rootDirectoryArrayRecord[j].rdSize = 0;
					rootDirectoryArrayRecord[j].rdTime = 0;
					rootDirectoryArrayRecord[j].rdDate = 0;
					rootDirectoryArrayRecord[j].rdFirstSecor = 0;
					rootDirectoryArrayRecord[j].rdParent = 0;
					rootDirectoryArrayRecord[j].rdAttrib = 0;
					for (int h =99; h<1024; h++)
					{
						if (dataSectionArrayRecord[h].dsID == sector)
						{
							dataSectionArrayRecord[h].dsID = 0;
							strcpy(dataSectionArrayRecord[h].dsData,"");
						}
					}

					printf("effacement ok \n");
				}

			}

		}
		////////////////deld/////////////////////////////
		if (commande[0] == 'd' && commande[1] == 'e' && commande[2] == 'l' && commande[3] == 'd' )
		{

			char nom[255];
			int j = 0;
			int position;
			int longueur = strlen(commande);
			int type;
			for (int i = 5; i< longueur; i++)
			{
				nom[j] = commande[i];
				j++;
			}
			nom[j]='\0';
			for (j =99 ; j<1024; j++)
			{
				if ((strcmp (rootDirectoryArrayRecord[j].rdName , nom)==0) && (rootDirectoryArrayRecord[j].rdType == 0))
				{

					strcpy(rootDirectoryArrayRecord[j].rdName,"");
					type = rootDirectoryArrayRecord[j].rdType;
					///////////////////////////////////////////////////fdvf
					printf("effacement ok \n");
				}
			}
		}

		//////////////////////////////////////////////////////

	
		if (strcmp(commande,"drspace") == 0 )
		{

			if (rootDirectoryArrayRecord[0].rdType == ' ')
			{
				printf("Drive empty, 100%% free \n");
			}
		}
		if (strcmp(commande,"?") == 0 || strcmp(commande,"help") == 0 || strcmp(commande,"man") == 0)
		{

			printf("VER \n DATE \n TIME \n DIR \n CAT \n EDIT nomfichier.extension Le nom est limité à 11 caractères, l'extension à 4 caractères \n DEL \n MKDIR \n RMDIR \n DEFRAG \n REPACK \n CP \n ECHO \n DRSPACE \n FORMAT \n CD \n CLS \n help : manuel \n ? : manuel \n man : manuel \n");
		}

	}
}

void initArrayRecord(rootDirectory arrayRecord[1024])
{
	for (int i = 0 ; i < 1024; i++)
	{
		arrayRecord[i].rdID  = 0;// identifiant 0 à 99 réservés
		strcpy(arrayRecord[i].rdName,"");
		strcpy(arrayRecord[i].rdExtension,"");
		arrayRecord[i].rdType = 2;
		arrayRecord[i].rdSize = 0;
		arrayRecord[i].rdTime = 0;
		arrayRecord[i].rdDate = 0;
		arrayRecord[i].rdFirstSecor = 0;
		arrayRecord[i].rdParent = 0;
		arrayRecord[i].rdAttrib = 0;
		arrayRecord[i].rdScan = 0;
	}
}
void initArrayRecord(dataSection arrayRecord[1024])
{
	for (int i = 0 ; i < 1024; i++)
	{
		arrayRecord[i].dsID = 0;
		strcpy(arrayRecord[i].dsData,"");
		arrayRecord[i].dsPrev = 0;
		arrayRecord[i].dsNext = 0;
	}
}

Conclusion :


Fait en cour en IG1 à godefroy de bouillon 63000

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
jeudi 1 mars 2012
Statut
Membre
Dernière intervention
3 mars 2012

excellent travail comme debutant,je souhaite progression et continuité merci.
Messages postés
12
Date d'inscription
dimanche 21 mai 2006
Statut
Membre
Dernière intervention
10 septembre 2011

Je comprend mieux tes remarque alors !
Je ne connais pas bien le fonctionnement de se site, c'est pour cela. Il faut m'en excuser.
++
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
> Je partage se code qui me semble simple a lire pour que les débutants comme moi puisse comprendre
Le problème c'est que ça n'aide pas les débutants. La manière dont tu fais les choses n'est pas la bonne (fonction monolithique...)

> J'aurais compris que tu critique mon code, si mon niveau n'avais pas été celui d'un débutant.
Dès le moment où tu postes dans cette section, tu es soumis à la critique, quelque soit ton niveau.

Attention ne pas confondre:
- Le dépot de source: qui consiste à montrer une méthode "propre" de faire quelque chose ou de présenter un projet original (et conséquent).
- Le forum: Montrer son code, dont on sait que la qualité est discutable, dans le but de s'améliorer.

Si tu viens juste de débuter, dans ce cas, poste ton code dans le forum avec comme titre: "Venez critiquer mon code pour que je m'améliore". Quand tu auras progressé, et que tu seras capables de présenter un projet dont le travail est rigoureux, propre, commenté, et rempli de bonnes pratiques, tu comprendras ma remarque. Évidemment, ça demande de l'expérience, donc ce n'est pas pour tout de suite, mais tu verras que ça viendra très vite.
Messages postés
12
Date d'inscription
dimanche 21 mai 2006
Statut
Membre
Dernière intervention
10 septembre 2011

Sa fait que 6 mois que je code je me doute bien, qu'il y a mieux. Mais ce n'est pas le but, je partage se code qui me semble simple a lire pour que les débutants comme moi puisse comprendre le mécanisme de gestion des fichiers, dossiers et de l’interpréteur de commande.
J'aurais compris que tu critique mon code, si mon niveau n'avais pas été celui d'un débutant.
Cdlt.
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
* Main non standard
* Pas de fonction, tout à l'arrache dans le main
* Utilisation d'un compilateur C++ pour faire du C en oubliant des directives propres au C++.
* L'ensemble des chaines en statique (Que se passe-t-il si on met des tailles de chaînes très grande ?)
* Titre de projet trompeur. Ce n'est en rien un OS.
* Des variables globales

Sont toutes les raisons pour lesquelles je ne recommande absolument pas ce code !
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.