Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.23 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. const int bloqueLogico = 2; //1 bloque logico hecho por bloques fisicos de 1 bytes cada uno
  7. const int fsInformacion = 7; //7 bloques logicos, tamano del FS, tamano del disco, inicio del mapa, inicio de los archivos, inicio de los datos, cant archivos actual, cant archivos total
  8. const int archivoAtributos = 3; //3 bloques logicos
  9. const double archivosPorDisco = 0.40;
  10.  
  11. char *discoGlobal; //Para poder abrir el archivo del disco
  12.  
  13. unsigned char crearDisco();
  14. unsigned char particionarDisco(char *ptamanoDisco);
  15. long leerBloque(long pbloque);
  16. unsigned char escribirBloque(long pbloque, long pvalor);
  17. unsigned char actualizarMapaBits(long pbloque, unsigned char pbit);
  18. long consultarEspacioDisponible(long pinicioBloque, long pfinBloque, long pcantidad);
  19. unsigned char crearArchivo(char *pnombre, long ptamano);
  20. void consultarDiscoEstructura();
  21. void consultarSistemaArchivos();
  22. unsigned char montarDisco(char *pnombre);
  23. unsigned char existeDiscoMontado();
  24. void consola();
  25. unsigned char potencia();
  26. unsigned char maximoDisco();
  27.  
  28. int main(){
  29.  
  30. while(1){
  31. consola();
  32. }
  33.  
  34. /*crearDisco("prueba.txt", "2048");
  35. particionarDisco("1024");
  36. consultarSistemaArchivos();
  37.  
  38. actualizarMapaBits(600, 0);
  39. actualizarMapaBits(601, 0);
  40. actualizarMapaBits(602, 0);
  41.  
  42. int result = consultarEspacioDisponible(leerBloque(5), leerBloque(6), 3);
  43.  
  44. if(result != -1){
  45. printf("Hay espacios disponibles en: %d \n", result);
  46. }
  47. else{
  48. printf("No hay espacios disponibles \n");
  49. }*/
  50. //consultarDiscoEstructura();
  51.  
  52. //printf("%d \n", leerBloque(2));
  53. //printf("%d \n", leerBloque(29));
  54. //printf("%d \n", leerBloque(30));
  55. //printf("%d \n", leerBloque(31));
  56. //printf("%d \n", leerBloque(32));
  57. //printf("%d \n", leerBloque(33));
  58.  
  59. //particionarDisco("1024");
  60. //printf("%d \n", leerBloque(1));
  61. //consultarDiscoEstructura();
  62. //crearDisco("prueba.txt", "1024");
  63. //escribirBloque(1, 1000);
  64. //escribirBloque(1, 1);
  65. //escribirBloque(3, 2);
  66. //escribirBloque(4, 0);
  67. //printf("Bloque a leer es %d \n", leerBloque(1));
  68.  
  69. system("PAUSE");
  70. return 0;
  71. }
  72.  
  73. void consola(){
  74.  
  75. char buffer[100];
  76. char *trozo = NULL;
  77. char separador[] = " ";
  78.  
  79. printf("admin@sofis-shell:~$ ");
  80. fgets(buffer, sizeof(buffer), stdin);
  81.  
  82. strtok(buffer, "\n");
  83. trozo = strtok(buffer, separador);
  84.  
  85. //Comando para crear el disco-------------------------------------------------------------------------------------------------------------
  86. if(!strcmp(trozo, "mkfs")){
  87. char *nombreDisco = strtok(NULL, separador);
  88. char *tamanoDisco = strtok(NULL, separador);
  89.  
  90. if(!(nombreDisco == NULL) && !(tamanoDisco == NULL)){
  91. if(crearDisco(nombreDisco, tamanoDisco) == 1 && particionarDisco(tamanoDisco) == 1){
  92. printf("El disco se creo correctamente \n");
  93. }
  94. }
  95. else{
  96. printf("Comando invalido... \n");
  97. }
  98. }
  99. //Comando para crear un archivo-----------------------------------------------------------------------------------------------------------
  100. else if(!strcmp(trozo, "crtf")){
  101. if(existeDiscoMontado() == 1){
  102. char *nombreArchivo = strtok(NULL, separador);
  103. char *tamanoDisco = strtok(NULL, separador);
  104.  
  105. if(!(nombreArchivo == NULL) && !(tamanoDisco == NULL)){
  106. //crearArchivo(nombreArchivo,tamanoDisco); //Falta de crear el metodo para crear un archivo con los 2 parametros
  107. }
  108. else{
  109. printf("Comando invalido... \n");
  110. }
  111. }
  112. else{
  113. printf("No hay un disco montado... \n");
  114. }
  115. }
  116. //Comando para borrar un archivo----------------------------------------------------------------------------------------------------------
  117. else if(!strcmp(trozo, "rmvf")){
  118. if(existeDiscoMontado() == 1){
  119. char *nombreArchivo = strtok(NULL, separador);
  120.  
  121. if(!(nombreArchivo == NULL)){
  122. //borrarArchivo(nombreArchivo); //Falta de crear el metodo para borrar un archivo con el parametro
  123. }
  124. else{
  125. printf("Comando invalido... \n");
  126. }
  127. }
  128. else{
  129. printf("No hay un disco montado... \n");
  130. }
  131. }
  132. //Comando para listar la informacion del disco--------------------------------------------------------------------------------------------
  133. else if(!strcmp(trozo, "ls")){
  134. if(existeDiscoMontado() == 1){
  135. //consultarDiscoInformacion(); //Falta de crear el metodo para consultar la informacion del disco
  136. }
  137. else{
  138. printf("No hay un disco montado... \n");
  139. }
  140. }
  141. //Comando para consultar la estructura interna del disco----------------------------------------------------------------------------------
  142. else if(!strcmp(trozo, "vdisk")){
  143. if(existeDiscoMontado() == 1){
  144. consultarDiscoEstructura();
  145. }
  146. else{
  147. printf("No hay un disco montado... \n");
  148. }
  149. }
  150. //Comando para consultar la informacion del sistema de archivos---------------------------------------------------------------------------
  151. else if(!strcmp(trozo, "infdisk")){
  152. if(existeDiscoMontado() == 1){
  153. consultarSistemaArchivos();
  154. }
  155. else{
  156. printf("No hay un disco montado... \n");
  157. }
  158. }
  159. //Comando para montar un disco------------------------------------------------------------------------------------------------------------
  160. else if(!strcmp(trozo, "mount")){
  161. char *nombreDisco = strtok(NULL, separador);
  162.  
  163. if(!(nombreDisco == NULL)){
  164. if(montarDisco(nombreDisco) == 1){
  165. printf("El disco se monto correctamente \n");
  166. }
  167. else{
  168. printf("Hubo un error al montar el disco o el disco no existe... \n");
  169. }
  170. }
  171. }
  172. else{
  173. printf("Comando invalido... \n");
  174. }
  175.  
  176. fflush(stdin);
  177. }
  178.  
  179. unsigned char crearDisco(char *pnombre, char *ptamanoDisco){ //Tamaño de disco adecuado es de 16384;
  180.  
  181. //Variables
  182. int i;
  183. long tamanoDisco = atoi(ptamanoDisco);
  184.  
  185. //Valor de retorno
  186. unsigned char resultado = 1;
  187.  
  188. //Logica
  189. discoGlobal = strdup(pnombre);
  190. FILE *disco = fopen(discoGlobal, "w+");
  191.  
  192. if(disco != NULL){
  193. for(i = 0; i < tamanoDisco; i++){
  194. fputs("-", disco);
  195. }
  196. }
  197. else{
  198. resultado = 0;
  199. }
  200.  
  201. fclose(disco);
  202.  
  203. return resultado;
  204. }
  205.  
  206. unsigned char particionarDisco(char *ptamanoDisco){
  207.  
  208. //Variables
  209. long bloquesTotal;
  210. long bloquesMapa;
  211. long bloquesArchivos;
  212. long bloquesDatos;
  213.  
  214. //Valor de retorno
  215. unsigned char resultado = 1;
  216.  
  217. //Logica
  218. FILE *disco = fopen(discoGlobal, "r+");
  219.  
  220. if(disco != NULL){
  221. //Se especifican los tamaños de cada zona del sistema de archivos
  222. bloquesTotal = atoi(ptamanoDisco) / bloqueLogico;
  223. bloquesMapa = bloquesTotal / 8;
  224. bloquesDatos = bloquesTotal - (bloquesMapa + bloquesArchivos + fsInformacion);
  225. bloquesArchivos = ceil((atoi(ptamanoDisco) * archivosPorDisco) / bloqueLogico);
  226.  
  227. //Se almacena en el disco el tamaño del sistema de archivos
  228. escribirBloque(1, fsInformacion + bloquesMapa + bloquesArchivos);
  229.  
  230. //Se almacena en el disco el tamaño del disco
  231. escribirBloque(2, atoi(ptamanoDisco));
  232.  
  233. //Se almacena en el disco el tamaño de la cantidad de archvios actuales. Se pone en 0 por que esta en desarollo y es un disco nuevo
  234. escribirBloque(3, 0);
  235.  
  236. //Se almacena en el disco el numero de bloque del mapa de bits
  237. escribirBloque(4, fsInformacion + 1);
  238.  
  239. //Se almacena en el disco el numero de bloque del los archivos
  240. escribirBloque(5, fsInformacion + bloquesMapa + 1);
  241.  
  242. //Se almacena en el disco el numero de bloque del los datos
  243. escribirBloque(6, fsInformacion + bloquesMapa + bloquesArchivos + 1);
  244.  
  245. //Se almacena en el disco el total de archivos que puede direccionar el disco
  246. escribirBloque(7, bloquesArchivos / archivoAtributos);
  247.  
  248. //Formatear mapa de bits
  249. int i;
  250. for(i = 0; i < bloquesMapa; i++){
  251. escribirBloque(fsInformacion + 1 + i, 65535);
  252. }
  253.  
  254. //Actualizar los bloques usados
  255. for(i = 1; i < (fsInformacion + bloquesMapa) + 1; i++){
  256. actualizarMapaBits(i, 1);
  257. }
  258. }
  259. else{
  260. resultado = 0;
  261. }
  262.  
  263. fclose(disco);
  264.  
  265. return resultado;
  266. }
  267.  
  268. long leerBloque(long pbloque){
  269.  
  270. //Variables
  271. int i, j;
  272. long byteInicio = 0;
  273. long posicion = 0;
  274. int contador = 0;
  275. unsigned char byte;
  276.  
  277. //Valor de retorno
  278. long resultado = 0;
  279.  
  280. //Logica
  281. FILE *disco = fopen(discoGlobal, "r+");
  282.  
  283. if(disco != NULL){
  284. byteInicio = ((pbloque * bloqueLogico) - (bloqueLogico));
  285. posicion = byteInicio + bloqueLogico; //Bloque logico se refiere a la cantidad de bytes que compone el bloque logico
  286.  
  287. for(i = posicion; i > byteInicio; i--){
  288. fseek(disco, i-1, SEEK_SET);
  289. byte = fgetc(disco);
  290.  
  291. for(j = 0; j < 8; j++){
  292. if(byte & 1){
  293. resultado = resultado + pow(2,(contador));
  294. }
  295. contador++;
  296. byte >>= (1);
  297. }
  298. }
  299. }
  300. else{
  301. resultado = -1;
  302. }
  303.  
  304. fclose(disco);
  305.  
  306. return resultado;
  307. }
  308.  
  309. unsigned char escribirBloque(long pbloque, long pnumero){
  310.  
  311. //Variables
  312. int i, j;
  313. long byteInicio;
  314. long resto, cociente;
  315. int totalBits = bloqueLogico * 8;
  316. int auxTotalBits = totalBits - 1; //Auxiliar que almacena la variable totalBits. Se realiza -1 por que se trabaja con arreglos donde el indice se inicia en 0
  317. long nuevo[totalBits - 1]; //Se realiza -1 por que se trabaja con arreglos donde el indice se inicia en 0
  318. unsigned long byte;
  319. int indiceTotal = 0;
  320. int indiceTemporal;
  321.  
  322. //Valor de retorno
  323. unsigned char resultado = 1;
  324.  
  325. //Logica
  326. FILE *disco = fopen(discoGlobal, "r+");
  327.  
  328. if(disco != NULL){
  329. byteInicio = ((pbloque * bloqueLogico) - (bloqueLogico));
  330.  
  331. //Se convierte en binario
  332. for(i = 0; i <= totalBits; i++){
  333. resto = pnumero % 2;
  334. cociente = pnumero / 2;
  335. pnumero = cociente;
  336. nuevo[auxTotalBits] = resto; //Se almacena de forma invertida
  337. auxTotalBits--;
  338. }
  339.  
  340. for(i = 0; i < bloqueLogico; i++){
  341. byte = 0;
  342. indiceTemporal = (indiceTotal + 8) - 1; //Se realiza -1 por que se trabaja con arreglos donde el indice se inicia en 0
  343. for(j = 0; j < 8; j++){
  344. byte += nuevo[indiceTemporal--] * (pow(2,j)); //Se llema hasta el primer bit del byte, y se convierte en decimal
  345. indiceTotal++;
  346. }
  347. fseek(disco, byteInicio, SEEK_SET);
  348. fputc(byte, disco);
  349. byteInicio++;
  350. }
  351. }
  352. else{
  353. resultado = 0;
  354. }
  355.  
  356. fclose(disco);
  357.  
  358. return resultado;
  359. }
  360.  
  361. unsigned char actualizarMapaBits(long pbloque, unsigned char pbit){
  362.  
  363. //Variables
  364. int i;
  365. unsigned char byte;
  366. unsigned long byteModificado = 0;
  367. int byteABrincar = floor((pbloque - 1) / 8) + ((leerBloque(4) - 1) * bloqueLogico); //Leer bloque 4 se refiere al inicio del mapa de bits
  368. int auxBits = 8;
  369. int indiceTemporal = 8;
  370. long nuevo[auxBits - 1]; //Se realiza -1 por que se trabaja con arreglos donde el indice se inicia en 0
  371.  
  372. //Valor de retorno
  373. unsigned char resultado = 1;
  374.  
  375. //Logica
  376. FILE *disco = fopen(discoGlobal, "r+");
  377.  
  378. if(disco != NULL){
  379. //Se pone la aguja al bloque a brincar para leer el byte a modificar
  380. fseek(disco, byteABrincar, SEEK_SET);
  381. byte = fgetc(disco);
  382.  
  383. //Se pasa el valor a binario se invierte la posicion en el nuevo arreglo
  384. for(i = auxBits - 1; i >= 0; i--){
  385. nuevo[i] = (byte & 1);
  386. byte >>= (1);
  387. }
  388.  
  389. //Calcula el indice del posicion del nuevo arreglo para actualizar el bit
  390. int indiceACambiar = pbloque - (8 * floor(pbloque / 8));
  391.  
  392. //Excepcion si el bit a actualizar es el ultimo bit del arreglo
  393. if(indiceACambiar == 0){
  394. indiceACambiar = indiceACambiar + 8;
  395. }
  396.  
  397. //Se cambia el valor del arreglo con el indice calculado anteriormente
  398. nuevo[indiceACambiar - 1] = pbit;
  399.  
  400. //Se convierte a decimal despues de haber sido modificado con la funcion anterior
  401. indiceTemporal--;
  402. for(i = 0; i < auxBits; i++){
  403. byteModificado += nuevo[indiceTemporal--] * (pow(2,i)); //Se llema hasta el primer bit del byte, y se convierte en decimal
  404. }
  405.  
  406. //Se pone la aguja al bloque a brincar para guradar el byte que se modifico
  407. fseek(disco, byteABrincar, SEEK_SET);
  408. fputc(byteModificado, disco);
  409. }
  410. else{
  411. resultado = 0;
  412. }
  413.  
  414. fclose(disco);
  415.  
  416. return resultado;
  417. }
  418.  
  419. long consultarEspacioDisponible(long pinicioBloque, long pfinBloque, long pcantidad){
  420.  
  421. //Variables
  422. int i, j;
  423. unsigned char byte;
  424. int bits = 8;
  425. long nuevo[bits - 1];
  426. long contTotalBloques = 0;
  427. int disponibles = 0;
  428. int limite = (pfinBloque - pinicioBloque) / 8;
  429. int terminar = 0;
  430.  
  431. //Valor de retorno
  432. long resultado;
  433.  
  434. //Logica
  435. FILE *disco = fopen(discoGlobal, "r+");
  436.  
  437. if(disco != NULL){
  438. for(i = 0; i < limite; i++){
  439. fseek(disco, pinicioBloque, SEEK_SET);
  440. byte = fgetc(disco);
  441.  
  442. for(j = bits - 1; j >= 0; j--){
  443. nuevo[j] = 0;
  444. nuevo[j] = (byte & 1);
  445. byte >>= (1);
  446. }
  447.  
  448. for(j = 0; j < bits; j++){
  449. if(nuevo[j] == 0){
  450. disponibles++;
  451. if(disponibles == pcantidad){
  452. contTotalBloques++;
  453.  
  454. return contTotalBloques - pcantidad;
  455. }
  456. }
  457. else{
  458. disponibles = 0;
  459. }
  460. contTotalBloques++;
  461. }
  462. pinicioBloque++;
  463. }
  464.  
  465. resultado = -1;
  466. }
  467. else{
  468. resultado = -1;
  469. }
  470.  
  471. fclose(disco);
  472.  
  473. return resultado;
  474. }
  475.  
  476. unsigned char crearArchivo(char *pnombre, long ptamano){
  477.  
  478. //Variables
  479. int i, j;
  480. long bloqueArchivos = leerBloque(5);
  481. long bloqueDatos = leerBloque(6);
  482. long limite = (leerBloque(2) / bloqueLogico) - leerBloque(1);
  483.  
  484. long posArchivoDis = consultarEspacioDisponible(bloqueArchivos, bloqueDatos - 1, 3);
  485. long posDatosDis = consultarEspacioDisponible(bloqueDatos, limite, ptamano);
  486.  
  487. //Valor de retorno
  488. unsigned char resultado = 1;
  489.  
  490. //Logica
  491. FILE *disco = fopen(discoGlobal, "r+");
  492.  
  493. if(disco != NULL){
  494. if((posArchivoDis != -1) && (posDatosDis != -1)){
  495.  
  496. }
  497. else{
  498. resultado = 0;
  499. }
  500. }
  501. else{
  502. resultado = 0;
  503. }
  504.  
  505. fclose(disco);
  506.  
  507. return resultado;
  508. }
  509.  
  510. void consultarDiscoEstructura(){
  511.  
  512. //Variables
  513. int i;
  514. long tamanoFS = leerBloque(1);
  515. long byteInicio = ((leerBloque(6) * bloqueLogico) - (bloqueLogico));
  516. long limite = ((leerBloque(2) / bloqueLogico) - leerBloque(1)) * bloqueLogico;
  517.  
  518. //Logica
  519. FILE *disco = fopen(discoGlobal, "r+");
  520.  
  521. if(disco != NULL){
  522. for(i = 0; i < tamanoFS; i++){
  523. printf("SOFIS");
  524. }
  525.  
  526. for(i = 0; i < limite; i++){
  527. fseek(disco, byteInicio, SEEK_SET);
  528. printf("%c", fgetc(disco));
  529. byteInicio++;
  530. }
  531. printf("\n");
  532. }
  533.  
  534. fclose(disco);
  535. }
  536.  
  537. void consultarSistemaArchivos(){
  538.  
  539. printf("-------------------------------------------------------------------- \n");
  540. printf("1. Tamano total del sistema de archivos: %d \n", leerBloque(1));
  541. printf("2. Tamano total del disco es: %d \n", leerBloque(2));
  542. printf("3. Cantidad de archivos actuales: %d \n", leerBloque(3));
  543. printf("4. Cantidad de archivos total que puede almacenar: %d \n", leerBloque(7));
  544. printf("5. Numero de bloque de incio del mapa de bits: %d \n", leerBloque(4));
  545. printf("6. Numero de bloque de incio de los archivos: %d \n", leerBloque(5));
  546. printf("7. Numero de bloque de incio de los datos: %d \n", leerBloque(6));
  547. printf("-------------------------------------------------------------------- \n");
  548. }
  549.  
  550. unsigned char montarDisco(char *pnombre){
  551.  
  552. //Valor de retorno
  553. unsigned char resultado = 1;
  554.  
  555. //Logica
  556. free(discoGlobal);
  557. discoGlobal = strdup(pnombre);
  558. FILE *disco = fopen(discoGlobal, "r+");
  559.  
  560. if(disco == NULL){
  561. resultado = 0;
  562. free(discoGlobal);
  563. }
  564.  
  565. fclose(disco);
  566.  
  567. return resultado;
  568. }
  569.  
  570. //Opcional
  571. unsigned char desmontarDisco(){
  572.  
  573. //Valor de retorno
  574. unsigned char resultado = 1;
  575.  
  576. //Logica
  577. free(discoGlobal);
  578. FILE *disco = fopen(discoGlobal, "r+");
  579.  
  580. if(disco != NULL){
  581. resultado = 0;
  582. }
  583.  
  584. fclose(disco);
  585.  
  586. return resultado;
  587. }
  588.  
  589. unsigned char existeDiscoMontado(){
  590.  
  591. //Valor de retorno
  592. unsigned char resultado = 1;
  593.  
  594. //Logica
  595. if(discoGlobal == NULL){
  596. resultado = 0;
  597. }
  598.  
  599. return resultado;
  600. }
  601.  
  602. unsigned char potencia(long ptamanoDisco){
  603.  
  604. if((ptamanoDisco%2) == 0){
  605. return 1;
  606. }
  607. }
  608.  
  609. unsigned char maximoDisco(long ptamanoDisco){
  610.  
  611. if(ptamanoDisco>4096){
  612. return 1;
  613. }
  614. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement