Skip to content
This repository has been archived by the owner on Aug 15, 2024. It is now read-only.

Proyecto2 #120

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 131 additions & 0 deletions proyectos/2/BlancasMauricio-HernandezDulce/P2FS.py
Original file line number Diff line number Diff line change
@@ -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()
75 changes: 75 additions & 0 deletions proyectos/2/BlancasMauricio-HernandezDulce/README.me
Original file line number Diff line number Diff line change
@@ -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ó.
Binary file not shown.