diff --git a/proyectos/2/BlancasMauricio-HernandezDulce/P2FS.py b/proyectos/2/BlancasMauricio-HernandezDulce/P2FS.py new file mode 100644 index 0000000..f856641 --- /dev/null +++ b/proyectos/2/BlancasMauricio-HernandezDulce/P2FS.py @@ -0,0 +1,131 @@ + +import os +import math + +#Abrimos el archivo, lo leemos y obtenemos su tamaño +fs = open('fiunamfs.img', 'r+b') +rd = fs.read(60).decode('utf-8') +tam = int(rd[40:46].rstrip('\x00')) + +#Obtenemos el número de archivos por directorio +indicearch = int((int(rd[47:50].rstrip('\x00'))) * 8 * 256 / 64) + + +def fileunam(): + lista = [] + tamaux = tam + + for i in range(indicearch): + fs.seek(tamaux) + rd2 = fs.read(64).decode('utf-8') + if rd2[0:16] != '...............\x00': + lista2 = [] + lista2.append(rd2[0:16].rstrip('\x00').lstrip(' ')) + lista2.append(int(rd2[16:25].rstrip('\x00'))) + lista2.append(int(rd2[25:31].rstrip('\x00'))) + lista2.append(rd2[31:35]) + lista2.append(rd2[35:37]) + lista2.append(rd2[37:39]) + lista2.append(rd2[39:41]) + lista2.append(rd2[41:43]) + lista2.append(math.ceil(lista2[1] / 2048 + lista2[2])) + lista2.append(rd2[43:45]) + lista.append(lista2) + tamaux += 64 + + return lista + + +def ordenar(): + lista = fileunam() + + for z in lista: + print('\nNombre:', z[0]) + print('\nTamaño:', z[1]) + print('\nCluster inicio:', z[2]) + print('\nAño creación:', z[3]) + print('\nMes creación:', z[4]) + print('\nDía creación:', z[5]) + print('\nHora creación:', z[6]) + print('\nMinuto creación:', z[7]) + print('\nCluster final:', z[8]) + print('\nSegundo creación:', z[9]) + + + +def fiPC(): + + nombre1 = input('Dame el nombre del archivo: ') + nombre2 = input('Dame el nuevo nombre') + + lista = fileunam() + existe = -1 + #Recorremos la lista y si el primer elemento es igual al nombre del archivo entonces usamos nuestra variable de existencia + for z in lista: + if z[0] == nombre1: + flen = z[1] + existe = z[2] + break + + if existe != -1: + fs.seek(existe * tam) + rd = fs.read(flen) + newfile1 = open(nombre2, 'wb') + newfile1.write(rd) + newfile1.close() + print('\nCopiado') + + +def borrar(): + nombre1 = input('Dame el nombre del archivo: ') + lista = fileunam() + + existe = -1 + for z in lista: + if z[0] == nombre1: + flen = z[1] + existe = z[2] + break + + if existe != -1: + fs.seek(existe * tam) + for i in range(flen): + fs.write(('\x00').encode('utf-8')) + + tamaux = tam + for i in range(indicearch): + fs.seek(tamaux) + rd2 = fs.read(64).decode('utf-8') + if rd2[0:16].lstrip(' ').rstrip('\x00') == nombre1: + fs.seek(tamaux) + fs.write(('...............\x0000000000\x0000000\x0000000000000000\x0000000000000000\x00\x00\x00\x00').encode('utf-8')) + break + tamaux += 64 + print('\nBorrado.') + +op = 10 +while op != 0: + + print('MENU') + print('0. SALIR') + print('1. Contenido') + print('2. Copiar de FIUNAM a PC') + print('3. Eliminar archivo de FIUNAM') + print('4. Desfragmentar') + + op = int(input('Ingrese la opción: ')) + + if op == 0: + print('\nbai') + elif op == 1: + ordenar() + elif op == 2: + fiPC() + elif op == 3: + borrar() + elif op == 4: + print('No funciona la banda :c') + else: + print('\nVuelve a intentarlo') + +fs.close() \ No newline at end of file diff --git a/proyectos/2/BlancasMauricio-HernandezDulce/README.me b/proyectos/2/BlancasMauricio-HernandezDulce/README.me new file mode 100644 index 0000000..660a241 --- /dev/null +++ b/proyectos/2/BlancasMauricio-HernandezDulce/README.me @@ -0,0 +1,75 @@ +### Proyecto 2 - Sistema de Archivos + +Lo que ustedes deben desarrollar es un programa que pueda obtener, crear y modificar información en el micro-sistema-de-archivos de la Facultad de Ingeniería, FiUnamFS. + +Siguiendo la especificación que aparece en la siguiente sección, tienen que desarrollar un programa que pueda: + +- Listar los contenidos del directorio +- Copiar uno de los archivos de dentro del FiUnamFS hacia tu sistema +- Copiar un archivo de tu computadora hacia tu FiUnamFS +- Eliminar un archivo del FiUnamFS +- Desafortunadamente, este sistema de archivos simplote es muy dado a la fragmentación externa. Generen también un programa que desfragmente al FiUnamFS. Ojo, la defragmentación debe hacerse dentro del sistema de archivos (no creando un sistema de archivos nuevo y copiando hacia éste). + + +### Solución + + fs = open('fiunamfs.img', 'r+b') + rd = fs.read(60).decode('utf-8') + tam = int(rd[40:46].rstrip('\x00')) + indicearch = int((int(rd[47:50].rstrip('\x00'))) * 8 * 256 / 64) + +Aquí observamos 3 cosas importantes, en primer lugar abrimos nuestra imagen fiunamfs, después de esto leemos lo que se enecuentra dentro y finalmente aplicamos algo parecido a un "length" ya que queremos saber los clusters dentro del directorio. + +En la última línea obtenemos el número de archivos que tiene nuestro directorio. + +imagen + +Aquí obtendremos la información de los archivos, declaramos una lista inicial donde se guardará todo. + + lista = [] + +Utilizamos un ciclo que nos ayudará a obtener la información de estos archivos o archivo. Si nuestro primer cluster no está vacío entonces declaramos una segunda lista en donde vamos a ir guardando la información de ese archivo pasando por cada uno de los clusters. + + for i in range(indicearch): + fs.seek(tamaux) + rd2 = fs.read(64).decode('utf-8') + +Esta función fue la primera que realizamos, donde colocamos la información que se pidió en archivos obtenidos de la imagen fiunamfs + + def ordenar(): + lista = fileunam() + + for z in lista: + print('\nNombre:', z[0]) + print('\nTamaño:', z[1]) + print('\nCluster inicio:', z[2]) + print('\nAño creación:', z[3]) + print('\nMes creación:', z[4]) + print('\nDía creación:', z[5]) + print('\nHora creación:', z[6]) + print('\nMinuto creación:', z[7]) + print('\nCluster final:', z[8]) + print('\nSegundo creación:', z[9]) + +La siguiente función es la que va a copiar un arhivo de fiunamfs a nuestro sistema + + if existe != -1: + fs.seek(existe * tam) + rd = fs.read(flen) + newfile1 = open(nombre2, 'wb') + newfile1.write(rd) + newfile1.close() + print('\nCopiado') + +Si el archivo existe entonces lo vamos a leer y con el nombre que se le solicitó al usuario vamos a copiar todo eso en un nuevo archivo y se le colocará el nombre ingresado. + +Para la función de borrado, del mismo modo, le solicitamos el nombre del archivo al usuario + + if rd2[0:16].lstrip(' ').rstrip('\x00') == nombre1: + fs.seek(tamaux) + fs.write(('...............\x0000000000\x0000000\x0000000000000000\x0000000000000000\x00\x00\x00\x00').encode('utf-8')) + break + +Aquí es donde sucede todo ya que buscamos que el nombre coicnida y una vez que se encuentra se hace una especie de borrado colocando \x00 al archivo. + +Finalmente la función de desfragmentación se intentó realizar, sin embargo, no funcionó. diff --git a/proyectos/2/BlancasMauricio-HernandezDulce/fiunamfs.img b/proyectos/2/BlancasMauricio-HernandezDulce/fiunamfs.img new file mode 100644 index 0000000..c11cc3d Binary files /dev/null and b/proyectos/2/BlancasMauricio-HernandezDulce/fiunamfs.img differ