0% encontró este documento útil (0 votos)
11 vistas12 páginas

Proyecto Entrega1

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas12 páginas

Proyecto Entrega1

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1-5-2024

Documentación Parte 1
Estructuras de Datos

Elaborado por:
Samuel David Pérez Brambila
Jesús Llamas Domínguez
César Pérez Arias
José Antonio Castro Mariscal
Luis Gilberto Arce Zaragoza

C.U.C.E.I
Carrera: Ingeniería en Computación - ICOM
Dirigido a: Carolina Elizabeth Gómez Márquez
Documentación del código.

Introducción.

En este documento se presenta una descripción detallada del código implementado


en C++ para un sistema de gestión de archivos. El sistema ofrece diversas
funcionalidades, como la creación de directorios y archivos, así como la
visualización, apertura y eliminación de estos mismos. La implementación se basa
en el uso de estructuras de datos como listas, pilas y colas, y en el manejo de
archivos y directorios mediante las bibliotecas estándar de C++ y <dirent.h> para
sistemas Unix.

Estructuras de datos:

Archivo.

Representa un archivo en el sistema de gestión de archivos. Cada archivo se


caracteriza por un nombre único y un contenido asociado. La estructura “Archivo”
proporciona una manera de almacenar esta información de manera organizada.

Directorio.

Representa un directorio en el sistema de gestión de archivos. Cada directorio tiene


un nombre único y puede contener múltiples archivos. La estructura “Directorio”
proporciona un contenedor para almacenar archivos, así como su propio nombre y
contenido (aunque este último no se utiliza en esta implementación).
Clases:

Lista.

Clase que implementa una lista utilizando un vector como contenedor subyacente.

Ofrece métodos para insertar elementos en la lista y para obtener iteradores al


principio y al final de la lista. La clase “Lista” es utilizada para mantener una
colección dinámica de directorios en el sistema.
Pila.

Esta clase implementa una pila utilizando (al igual que la anterior) un vector como
contenedor subyacente. Esta permite agregar elementos a la pila, quitar el elemento
superior y obtener el elemento superior sin sacarlo de la pila. La clase “Pila” se utiliza
para mantener un historial de directorios visitados por el usuario.

Cola.

Esta clase implementa una cola, igualmente utilizando un vector como contenedor
subyacente. Esta permite encolar elementos, desencolar el primer elemento y
obtener el frente de la cola. La clase “Cola” se utiliza para mantener una cola de
directorios para realizar operaciones como eliminar archivos.
Funciones:

mostrarElementos

Función que muestra los archivos y directorios presentes en una estructura dada,
como una lista. Esta función se utiliza para mostrar los elementos almacenados en
la lista principal de directorios del sistema.
limpiarPantalla

Función que limpia la pantalla y muestra un mensaje de retorno al menú principal.


Proporciona una forma visualmente agradable de navegar por las diferentes
opciones del programa.

crearDirectorio

Función que crea un nuevo directorio en el sistema si no existe previamente. Utiliza


la biblioteca <dirent.h> para manipular directorios en sistemas Unix y proporciona
retroalimentación al usuario sobre el resultado de la operación.

Función principal (“main”)

La función main del programa principal implementa un bucle que presenta un menú
al usuario y ejecuta las acciones correspondientes según la opción seleccionada.
Las acciones incluyen la creación de directorios, la creación de archivos, la
visualización de archivos y directorios, la apertura y eliminación de archivos, y la
salida del programa. Esta función coordina la interacción entre el usuario y el
sistema de gestión de archivos.
182 int main() {
183 // DeclaraciÓn de las estructuras de datos principales
184 Lista<Directorio, 50> listaDirectorios; // Lista de directorios
185 Pila<Directorio, 50> pilaDirectorios; // Pila de directorios
186 Cola<Directorio, 50> colaDirectorios; // Cola de directorios
187
188 // Variable para almacenar la opciÓn del usuario
189 int opcion;
190
191 // Bucle principal del programa
192 do {
193 // MenÚ principal
194 cout << "\n----- Sistema de Gestion de Archivos -----\n";
195 cout << "1. Crear un nuevo directorio\n";
196 cout << "2. Crear un nuevo archivo\n";
197 cout << "3. Mostrar archivos y directorios\n";
198 cout << "4. Salir\n";
199 cout << "Ingrese su opcion: ";
200 cin >> opcion;
201 [Link](); // Limpiar el buffer de entrada
202
203 // Switch para manejar las opciones del usuario
204 switch (opcion) {
205 case 1: {
206 // Crear un nuevo directorio
207 string nombreDirectorio;
208 cout << "\nIngrese el nombre del directorio: ";
209 getline(cin, nombreDirectorio);
210 Directorio nuevoDirectorio(nombreDirectorio);
211 if (crearDirectorio(nombreDirectorio)) {
212 [Link](nuevoDirectorio);
213 [Link](nuevoDirectorio);
214 [Link](nuevoDirectorio);
215 }
216 limpiarPantalla();
217 break;
218 }
219
220 case 2: {
221 // Crear un nuevo archivo
222 if (![Link]()) {
223 // Mostrar los directorios disponibles
224 cout << "\nDirectorios disponibles:\n";
225 for (const auto& directorio : listaDirectorios) {
226 cout << "- " << [Link] << endl;
227 }
228
229 // Solicitar al usuario que seleccione un directorio existente
230 string nombreDirectorio;
231 cout << "\nSeleccione el directorio donde desea crear el archivo:
";
232 getline(cin, nombreDirectorio);
233
234 // Buscar el directorio en la lista
235 auto iterDirectorio = find_if([Link](),
[Link](), [&](const Directorio& dir) {
236 return [Link] == nombreDirectorio;
237 });
238
239 // Verificar si se encontrÓ el directorio
240 if (iterDirectorio != [Link]()) {
241 // Pedir al usuario el nombre y contenido del archivo
242 string nombreArchivo, contenidoArchivo;
243 cout << "Ingrese el nombre del archivo: ";
244 getline(cin, nombreArchivo);
245 cout << "Ingrese el contenido del archivo (escriba 'END' en una
linea nueva para terminar):\n";
246
247 // Lectura del contenido del archivo hasta que se ingrese "END"
248 string linea;
249 while (getline(cin, linea)) {
250 // Eliminar los caracteres de nueva lÃ-nea al final de la
entrada
251 [Link](std::remove([Link](), [Link](), '\n'),
[Link]());
252
253 if (linea == "END") {
254 break;
255 } else {
256 contenidoArchivo += linea + '\n';
257 }
258 }
259
260 // Agregar el archivo al directorio
261 iterDirectorio->archivos.push_back(Archivo(nombreArchivo,
contenidoArchivo));
262
263 // Guardar el archivo en el disco
264 string rutaArchivo = nombreDirectorio + "/" + nombreArchivo;
265 ofstream archivo(rutaArchivo.c_str());
266 if (archivo.is_open()) {
267 archivo << contenidoArchivo;
268 [Link]();
269 cout << "\nArchivo creado exitosamente en la ruta \"" <<
rutaArchivo << "\"." << endl;
270 } else {
271 cout << "\nError: No se pudo crear el archivo en la ruta
\"" << rutaArchivo << "\". AsegÚrese de que el directorio exista." << endl;
272 }
273
274 limpiarPantalla();
275 } else {
276 cout << "El directorio especificado no existe." << endl;
277 limpiarPantalla();
278 }
279 } else {
280 cout << "No hay directorios disponibles para crear el archivo." <<
endl;
281 limpiarPantalla();
282 }
283 break;
284 }
285
286 case 3: {
287 // Mostrar archivos y directorios
288 system("clear || cls"); // Limpiar la pantalla
289 mostrarElementos(listaDirectorios);
290 cout << "\n----- Opciones -----\n";
291 cout << "1. Abrir un archivo\n";
292 cout << "2. Eliminar un archivo\n";
293 cout << "3. Regresar al menu principal\n";
294 cout << "Ingrese su opcion: ";
295 int opcionSubMenu;
296 cin >> opcionSubMenu;
297 switch (opcionSubMenu) {
298 case 1: {
299 // Abrir un archivo (con apoyo de Pila)
300 if (![Link]()) {
301 // Mostrar los directorios disponibles
302 cout << "\nDirectorios disponibles:\n";
303 for (const auto& directorio : listaDirectorios) {
304 cout << "- " << [Link] << endl;
305 }
306
307 // Solicitar al usuario que seleccione un directorio
existente
308 string nombreDirectorio;
309 cout << "\nSeleccione el directorio donde se encuentra el
archivo que desea abrir: ";
310 [Link]();
311 getline(cin, nombreDirectorio);
312
313 // Buscar el directorio en la lista
314 auto iterDirectorio = find_if([Link](),
[Link](), [&](const Directorio& dir) {
315 return [Link] == nombreDirectorio;
316 });
317
318 // Verificar si se encontrÓ el directorio
319 if (iterDirectorio != [Link]()) {
320 // Mostrar los archivos en el directorio seleccionado
321 cout << "\nArchivos en el directorio \"" <<
nombreDirectorio << "\":" << endl;
322 if (!iterDirectorio->[Link]()) {
323 for (size_t i = 0; i < iterDirectorio-
>[Link](); ++i) {
324 cout << i + 1 << ". " << iterDirectorio-
>archivos[i].nombre << endl;
325 }
326
327 // Permitir al usuario seleccionar un archivo
328 int seleccion;
329 cout << "\nSeleccione el archivo que desea abrir:
";
330 cin >> seleccion;
331 [Link]();
332
333 if (seleccion >= 1 && seleccion <= iterDirectorio-
>[Link]()) {
334 cout << "Abriendo el archivo \"" <<
iterDirectorio->archivos[seleccion - 1].nombre << "\"" << endl;
335 // Leer el contenido del archivo desde el disco
336 ifstream archivo((nombreDirectorio + "/" +
iterDirectorio->archivos[seleccion - 1].nombre).c_str());
337 string contenido;
338 if (archivo.is_open()) {
339 string linea;
340 while (getline(archivo, linea)) {
341 contenido += linea + "\n";
342 }
343 [Link]();
344 // Mostrar el contenido del archivo
345 cout << "\nContenido del archivo:" << endl;
346 cout << contenido << endl;
347 cout << "\nFin del contenido del archivo '"
<< iterDirectorio->archivos[seleccion - 1].nombre << "'" << endl;
348 } else {
349 cout << "No se pudo abrir el archivo." <<
endl;
350 }
351 limpiarPantalla();
352 } else {
353 cout << "SelecciÓn invÁlida." << endl;
354 limpiarPantalla();
355 }
356 } else {
357 cout << "No hay archivos en este directorio." <<
endl;
358 limpiarPantalla();
359 }
360 } else {
361 cout << "El directorio especificado no existe." <<
endl;
362 limpiarPantalla();
363 }
364 } else {
365 cout << "No hay directorios en el sistema." << endl;
366 limpiarPantalla();
367 }
368 break;
369 }
370
371 case 2: {
372 // Eliminar un archivo (con apoyo de Cola)
373 if (![Link]()) {
374 // Mostrar los directorios disponibles
375 cout << "\nDirectorios disponibles:\n";
376 for (const auto& directorio : listaDirectorios) {
377 cout << "- " << [Link] << endl;
378 }
379
380 // Solicitar al usuario que seleccione un directorio
existente
381 string nombreDirectorio;
382 cout << "\nSeleccione el directorio donde se encuentra el
archivo que desea eliminar: ";
383 [Link]();
384 getline(cin, nombreDirectorio);
385
386 // Buscar el directorio en la lista
387 auto iterDirectorio = find_if([Link](),
[Link](), [&](const Directorio& dir) {
388 return [Link] == nombreDirectorio;
389 });
390
391 // Verificar si se encontrÓ el directorio
392 if (iterDirectorio != [Link]()) {
393 // Mostrar los archivos en el directorio seleccionado
394 cout << "\nArchivos en el directorio \"" <<
nombreDirectorio << "\":" << endl;
395 if (!iterDirectorio->[Link]()) {
396 for (size_t i = 0; i < iterDirectorio-
>[Link](); ++i) {
397 cout << i + 1 << ". " << iterDirectorio-
>archivos[i].nombre << endl;
398 }
399
400 // Permitir al usuario seleccionar un archivo
401 int seleccion;
402 cout << "\nSeleccione el archivo que desea
eliminar: ";
403 cin >> seleccion;
404 [Link]();
405
406 if (seleccion >= 1 && seleccion <= iterDirectorio-
>[Link]()) {
407 cout << "Eliminando el archivo \"" <<
iterDirectorio->archivos[seleccion - 1].nombre << "\"" << endl;
408 // Eliminar el archivo del directorio y del
disco
409 string rutaArchivo = nombreDirectorio + "/" +
iterDirectorio->archivos[seleccion - 1].nombre;
410 if (remove(rutaArchivo.c_str()) == 0) {
411 // Eliminar el archivo de la lista de
archivos del directorio
412 iterDirectorio-
>[Link](iterDirectorio->[Link]() + seleccion - 1);
413 cout << "Archivo eliminado exitosamente."
<< endl;
414 } else {
415 cout << "No se pudo eliminar el archivo."
<< endl;
416 }
417 limpiarPantalla();
418 } else {
419 cout << "SelecciÓn invÁlida." << endl;
420 limpiarPantalla();
421 }
422 } else {
423 cout << "No hay archivos en este directorio." <<
endl;
424 limpiarPantalla();
425 }
426 } else {
427 cout << "El directorio especificado no existe." <<
endl;
428 limpiarPantalla();
429 }
430 } else {
431 cout << "No hay directorios en el sistema." << endl;
432 limpiarPantalla();
433 }
434 break;
435 }
436
437 case 3: {
438 // Regresar al menÚ principal
439 limpiarPantalla();
440 break;
441 }
442
443 default: {
444 cout << "OpciÓn invÁlida." << endl;
445 limpiarPantalla();
446 break;
447 }
448 }
449 break;
450 }
451
452 case 4: {
453 // Salir del programa
454 cout << "Saliendo del programa." << endl;
455 break;
456 }
457
458 default: {
459 cout << "OpciÓn invÁlida. Por favor, ingrese un nÚmero del 1 al 4." <<
endl;
460 break;
461 }
462 }
463 } while (opcion != 4);
464
465 return 0;
466 }

Funcionamiento del programa en conjunto.

El sistema de gestión de archivos implementado en este código opera de la


siguiente manera:

• Creación de Directorios y Archivos: El usuario tiene la opción de crear


nuevos directorios y archivos dentro del sistema. Para ello, se solicita al
usuario que ingrese un nombre para el directorio o archivo, y se almacena
esta información en las estructuras de datos correspondientes. Además, se
utiliza la función crearDirectorio() para crear un directorio en el sistema de
archivos si aún no existe.
• Visualización de Archivos y Directorios: El sistema permite al usuario ver
los archivos y directorios presentes en el sistema. Utilizando la función
mostrarElementos(), se muestra una lista de los directorios y archivos
almacenados en la lista principal de directorios del sistema.
• Apertura y Eliminación de Archivos: El usuario puede abrir archivos
existentes para ver su contenido o eliminar archivos no deseados. Al abrir un
archivo, se muestra su contenido en la pantalla. La eliminación de archivos
se realiza eliminando el archivo del directorio correspondiente y del sistema
de archivos.
• Historial de Directorios Visitados: Se mantiene un historial de los
directorios visitados por el usuario utilizando una pila. Esto permite al usuario
retroceder a directorios anteriores después de realizar operaciones como la
creación o eliminación de archivos.
• Interfaz de Usuario y Retroalimentación: Se proporciona una interfaz de
usuario amigable que muestra un menú con opciones disponibles. Se utiliza
la función limpiarPantalla() para limpiar la pantalla y proporcionar
retroalimentación visual al usuario durante la navegación por el sistema.

También podría gustarte