diff --git a/proyectos/MartinezIsrael/Proyecto_sistemas.pdf b/proyectos/MartinezIsrael/Proyecto_sistemas.pdf new file mode 100644 index 0000000..0921d0c Binary files /dev/null and b/proyectos/MartinezIsrael/Proyecto_sistemas.pdf differ diff --git a/proyectos/MartinezIsrael/README.md b/proyectos/MartinezIsrael/README.md new file mode 100644 index 0000000..e0de91b --- /dev/null +++ b/proyectos/MartinezIsrael/README.md @@ -0,0 +1,57 @@ +# Sistema de Archivos FiUnamFS + +Este proyecto implementa un sistema de archivos simulado llamado FiUnamFS, que es una representación de un diskette de 1440 Kilobytes con un sistema de archivos específico. La implementación permite listar el contenido del directorio, copiar archivos desde y hacia el sistema de archivos, y eliminar archivos. Se proporciona una interfaz gráfica simple usando `tkinter` para facilitar la interacción del usuario. + +## Características + +- Listar los contenidos del directorio. +- Copiar archivos desde FiUnamFS al sistema de archivos local. +- Copiar archivos desde el sistema de archivos local a FiUnamFS. +- Eliminar archivos de FiUnamFS. +- Interfaz gráfica simple para facilitar la interacción del usuario. + +## Requisitos del Sistema + +- Python 3.6 o superior +- `tkinter` para la interfaz gráfica +- `prettytable` para la visualización en formato de tabla en la interfaz gráfica + +## Uso + +1. **Ejecutar la aplicación:** + + Navega al directorio del proyecto y ejecuta el archivo principal: + + ```bash + python main.py + ``` + +2. **Interfaz Gráfica:** + + - **Nombre del archivo:** Ingrese el nombre del archivo en FiUnamFS con el que desea trabajar. + - **Listar directorio:** Muestra el contenido del directorio de FiUnamFS. + - **Copiar a local:** Copia un archivo desde FiUnamFS al sistema de archivos local. + - **Copiar a FiUnamFS:** Copia un archivo desde el sistema de archivos local a FiUnamFS. + - **Eliminar archivo:** Elimina un archivo de FiUnamFS + +## Estructura del Proyecto + +- `main.py`: Archivo principal que contiene la lógica y la interfaz gráfica. +- `README.md`: Este archivo de documentación. +- `fiunamfs.img`: Archivo de imagen del sistema de archivos (debe ser proporcionado por el usuario). + +## Detalles Técnicos + +- **Funciones Principales:** + - `leer_numero`: Lee un número de 4 bytes en formato little-endian. + - `escribir_numero`: Escribe un número de 4 bytes en formato little-endian. + - `leer_ascii`: Lee una cadena en formato ASCII 8-bit. + - `escribir_ascii`: Escribe una cadena en formato ASCII 8-bit. + - `validar_FiUnamFS`: Valida la integridad del sistema de archivos FiUnamFS. + - `leer_directorio`: Lee el contenido del directorio del sistema de archivos. + - `buscar_archivo`: Busca un archivo en el directorio. + - `fiunamfs_to_local`: Copia un archivo de FiUnamFS al sistema de archivos local. + - `local_to_fiunamfs`: Copia un archivo del sistema de archivos local a FiUnamFS. + - `eliminar_archivo`: Elimina un archivo de FiUnamFS. + + diff --git a/proyectos/MartinezIsrael/proyecto.py b/proyectos/MartinezIsrael/proyecto.py new file mode 100644 index 0000000..8d39190 --- /dev/null +++ b/proyectos/MartinezIsrael/proyecto.py @@ -0,0 +1,262 @@ +import os +import struct +import datetime +from threading import Thread, Barrier +from tkinter import Tk, Label, Button, Entry, Text, messagebox, filedialog, END +from prettytable import PrettyTable + +# Variables globales +directorio_fisico = "" # Directorio físico actual +ruta_FiUnamFS = "" # Ruta del archivo FiUnamFS +etiqueta_volumen = "" # Etiqueta del volumen +tamano_cluster_bytes = 0 # Tamaño del clúster en bytes +num_clusters_dir = 0 # Número de clústeres del directorio +num_clusters_total = 0 # Número total de clústeres +directorio = [] # Lista para almacenar información del directorio +cluster_set = set() # Conjunto de clústeres disponibles +menu = 0 # Variable de menú (sin uso en el código) +# Barrera para sincronizar hilos +barrier = Barrier(3) +cluster_ini = -1 # Clúster inicial +tam_bytes = 0 # Tamaño en bytes del archivo +rvtb = False # Resultado de verificación de tamaño +rbat = False # Resultado de verificación de archivo + +#Clase para almacenar la información de un archivo en FiUnamFS. + +class InfoArchivo: + def __init__(self, nombre_archivo, tam_bytes, cluster_ini, creacion, modificacion, pos): + self.nombre_archivo = nombre_archivo + self.tam_bytes = tam_bytes + self.cluster_ini = cluster_ini + self.creacion = creacion + self.modificacion = modificacion + self.pos = pos + +#Obtiene la ruta del archivo FiUnamFS. +def obtener_FiUnamFS(): + global directorio_fisico, ruta_FiUnamFS + directorio_fisico = os.path.dirname(os.path.abspath(__file__)) + ruta_FiUnamFS = os.path.join(directorio_fisico, "fiunamfs.img") + if not os.path.exists(ruta_FiUnamFS): + ruta_FiUnamFS = filedialog.askopenfilename(title="Seleccione el archivo FiUnamFS") + if not ruta_FiUnamFS: + return False + return True + +#Lee un número entero de 4 bytes desde una posición específica en #el archivo. +def leer_numero(file, posicion): + file.seek(posicion) + return struct.unpack(' tamano_cluster_bytes * len(cluster_set): + root.after(0, lambda: messagebox.showerror("Error", "El archivo es demasiado grande para ser almacenado en el sistema de archivos FiUnamFS.")) + rvtb = False + else: + cluster_ini = encontrar_contiguo(tam_bytes) + if cluster_ini == -1: + root.after(0, lambda: messagebox.showerror("Error", "No hay suficiente espacio contiguo en el sistema de archivos FiUnamFS.")) + rvtb = False + else: + rvtb = True + barrier.wait() +#Hilo para buscar un archivo en el directorio. +def buscar_archivo_thread(nombre_archivo): + global rbat + archivo = buscar_archivo(nombre_archivo) + if archivo is not None: + root.after(0, lambda: messagebox.showerror("Error", "Ya existe un archivo con ese nombre.")) + rbat = False + else: + rbat = True + barrier.wait() +#Copia un archivo desde el sistema de archivos local al sistema #de archivos FiUnamFS. +def local_to_fiunamfs(): + ruta_local = filedialog.askopenfilename(title="Seleccione el archivo a copiar") + if not ruta_local: + return + nombre_archivo = entry_nombre_archivo.get() + if not nombre_archivo: + messagebox.showerror("Error", "Debe ingresar un nombre para el archivo en FiUnamFS.") + return + verify_thread = Thread(target=verify_tam_bytes, args=(ruta_local,)) + buscar_thread = Thread(target=buscar_archivo_thread, args=(nombre_archivo,)) + verify_thread.start() + buscar_thread.start() + barrier.wait() + if not rvtb or not rbat: + return + try: + with open(ruta_FiUnamFS, "r+b") as f: + f.seek(cluster_ini * tamano_cluster_bytes) + with open(ruta_local, "rb") as f_local: + info = f_local.read() + f.write(info) + for i in range(cluster_ini, cluster_ini + ((tam_bytes + tamano_cluster_bytes - 1) // tamano_cluster_bytes)): + cluster_set.discard(i) + creacion = formato_fecha(datetime.datetime.fromtimestamp(os.path.getctime(ruta_local))) + modificacion = formato_fecha(datetime.datetime.fromtimestamp(os.path.getctime(ruta_local))) + for i in range(tamano_cluster_bytes, tamano_cluster_bytes * (num_clusters_dir + 1), 64): + tipo_archivo = leer_ascii(f, i, 1) + if tipo_archivo == "/": + escribir_ascii(f, i, "-") + escribir_ascii(f, i + 1, nombre_archivo, encoding='ascii') + escribir_numero(f, i + 16, tam_bytes) + escribir_numero(f, i + 20, cluster_ini) + escribir_ascii(f, i + 24, creacion) + escribir_ascii(f, i + 38, modificacion) + break + leer_directorio(False) + messagebox.showinfo("Éxito", "Archivo copiado exitosamente.") + except PermissionError: + messagebox.showerror("Error", "No se tienen los permisos necesarios para acceder al archivo o directorio especificado.") +#Elimina un archivo del sistema de archivos FiUnamFS. +def eliminar_archivo(): + nombre_archivo = entry_nombre_archivo.get() + archivo = buscar_archivo(nombre_archivo) + if archivo is None: + messagebox.showerror("Error", "El archivo no existe.") + return + with open(ruta_FiUnamFS, "r+b") as f: + escribir_ascii(f, archivo.pos, "/") + escribir_ascii(f, archivo.pos + 1, "###############", encoding='ascii') + leer_directorio(False) + messagebox.showinfo("Éxito", "Archivo eliminado exitosamente.") +# Función principal que inicializa la interfaz gráfica y carga el #sistema de archivos FiUnamFS. +def main(): + global text_info, entry_nombre_archivo, root + if not obtener_FiUnamFS(): + return + if not validar_FiUnamFS(): + return + + root = Tk() + root.title("Sistema de archivos FiUnamFS") + + Label(root, text="Nombre del archivo:").grid(row=0, column=0, padx=10, pady=10) + entry_nombre_archivo = Entry(root) + entry_nombre_archivo.grid(row=0, column=1, padx=10, pady=10) + + Button(root, text="Listar directorio", command=leer_directorio).grid(row=1, column=0, padx=10, pady=10) + Button(root, text="Copiar a local", command=fiunamfs_to_local).grid(row=1, column=1, padx=10, pady=10) + Button(root, text="Copiar a FiUnamFS", command=local_to_fiunamfs).grid(row=1, column=2, padx=10, pady=10) + Button(root, text="Eliminar archivo", command=eliminar_archivo).grid(row=1, column=3, padx=10, pady=10) + + text_info = Text(root, wrap='none', width=80, height=20) + text_info.grid(row=2, column=0, columnspan=4, padx=10, pady=10) + + root.mainloop() + +if __name__ == "__main__": + main()