public static void ValidaComandos(string directorioActual, List <string> historial) { try { Console.Write("{0}> ", directorioActual); //Se imprime el prompt string comando = Console.ReadLine(); //Se solicita una cadena para ser interpretada como "comando" con su respectivo "argumento" string[] argumentos = comando.Split(" ", 2, StringSplitOptions.RemoveEmptyEntries); /*Separa las palabras ingresadas cuando encuentra un espacio, * solamente obtiene 2 subcadenas el "comando" y su "argumento" * si existen espacios vacíos se eliminan * el programa contempla espacios como nombres de carpetas y archivos * además de contemplar las diferentes unidades de almacenamiento*/ historial.Add(comando); //Lo que sea que se ingrese se guardará como historial if (argumentos[0] == "dir" && argumentos.Length == 1) //Comando dir, verifica que solamente se haya ingresado la cadena dir { Comandos.MuestraDirectorio(directorioActual, historial); } else if (argumentos[0] == "dir") /*En caso de que se haya ingresado la cadena dir y más texto, * la segunda cadena se toma como argumento de directorio*/ { Comandos.MuestraDirectorio(argumentos[1], historial); //Se envía como argumento la segunda subcadena } else if (argumentos[0] == "cd" && argumentos.Length == 1) //Se verifica si solo se ingreso el comando sin argumentos { throw new ChangeDirectoryException(); } else if (argumentos[0] == "cd" && argumentos[1] == "..") //verifica que sólo se ingrese "cd .." para cambiar al directorio padre { string directorioPadre = Directory.GetParent(directorioActual).FullName; //Obtiene el directorio padre Comandos.CambiaDirectorio(directorioPadre, directorioActual, historial); } else if (argumentos[0] == "cd") { Comandos.CambiaDirectorio(argumentos[1], directorioActual, historial); } else if (argumentos[0] == "touch" && argumentos.Length == 1) //Se verifica si solo se ingreso el comando sin argumentos { throw new FileMissingException(); } else if (argumentos[0] == "touch") { Comandos.CreaArchivo(argumentos[1], historial); } else if (argumentos[0] == "move" && argumentos.Length == 1) //Se verifica si solo se ingreso el comando sin argumentos { throw new ParametrosExceptions(); } else if (argumentos[0] == "move") { Comandos.MueveArchivo(argumentos[1], historial); } else if (argumentos[0] == "history" && argumentos.Length == 1)//Se verifica si solo se ingreso el comando sin argumentos { Comandos.MuestraHistorial(historial); } else if (argumentos[0] == "cls" && argumentos.Length == 1)//Se verifica si solo se ingreso el comando sin argumentos { Comandos.LimpiaPantalla(historial); } else if (argumentos[0] == "exit" && argumentos.Length == 1)//Se verifica si solo se ingreso el comando sin argumentos { Comandos.TerminarPrograma(); } else { throw new InputException(); //Si no se ingresa algún comando establecido se origina esta excepción } } catch (InputException ie) { Console.WriteLine(ie.Message); ValidaComandos(directorioActual, historial); } catch (IndexOutOfRangeException) /*Se origina porque se comparan los índices de un arreglo en los if, * si no se ingresa al menos un caracter el índice 1 provoca esta excepción*/ { ValidaComandos(directorioActual, historial); /*Como el error solo es causado en caso de que no se ingrese nada (Enter o Space) * solo se vuelve a llamar a la función para que muestre nuvamente el prompt*/ } catch (ChangeDirectoryException cde) //Se origina porque se ingresa el comando cd sin ninún argumento { Console.WriteLine(cde.Message); ValidaComandos(directorioActual, historial); } catch (FileMissingException fme) { Console.WriteLine(fme.Message); ValidaComandos(directorioActual, historial); } catch (ParametrosExceptions pe) { Console.WriteLine(pe.Message); ValidaComandos(directorioActual, historial); } }
static void Main() { // Lista que guardara los comandos ejecutados List <string> history = new List <string>(); // Variable que almacena un valor booleano, esta variable mantendra el programa ejecutandose bool continua = true; // Variable que va a almacenar lo introducido por el usuario string comando; // Este bloque permite establecer la direccion try { // Se optiene el directorio Documents o Documentos string[] dir = Directory.GetDirectories(path, "Document*s?", SearchOption.TopDirectoryOnly); // Si solo existe un elemento en la variable dir, usara ese elemento para establecer el directorio if (dir.Length == 1) { Directory.SetCurrentDirectory(dir[0]); } // Si existen dos carpetas, Documentos y Documents se establece la direccion guardada en path else { Directory.SetCurrentDirectory(path); } } // Si no encuentra ninguna de las direcciones establecidas arriba, manda un error catch (DirectoryNotFoundException) { Console.WriteLine("No se encontro del directorio {0}", path); } // Este bloque ejecuta todo el programa do { // Imprime la direccion actual del directorio Console.Write("{0}> ", Directory.GetCurrentDirectory()); // Lee el comando comando = Console.ReadLine(); // Separa el comando por espacios string[] palabras = comando.Split(" "); // Variable que nos ayuda a validar los comandos string[] valida; // Obtiene el comando y lo evalua switch (palabras[0]) { case "dir": // Valida que el comando escrito solo reciba 2 argumentos valida = Comandos.ValidaComando(comando, 2); // Si la primera palabra es el comando se ejecuta lo siguiente if (valida[0].Equals("dir")) { try { // Obtiene el directorio actual string dir = Directory.GetCurrentDirectory(); // Verifica si recibe algun argumento if (String.IsNullOrEmpty(valida[1])) { // Llama a la funcion que cambia de directorio Comandos.DirComand(dir); } // Si recibe una carpeta como argumento else { // Se ejecuta el comando dir sobre el directorio ingresado Comandos.DirComand(dir + @"\" + valida[1]); } // Agrega el comando a la lista del historial history.Add(comando); } // Si no existe el directorio que se pasa como argumento manda una excepcion catch (DirectoryNotFoundException) { Console.WriteLine("El directorio '{0}' no existe", valida[1]); } } // Si no es el comando, es un mensjare y se imprime else { Console.WriteLine(valida[0]); } // Termina la ejecucion del bloque break; case "cd": // Valida que el comando escrito solo reciba 2 argumentos valida = Comandos.ValidaComando(comando, 2); // Si la primera palabra es el comando se ejecuta lo siguiente if (valida[0].Equals("cd")) { // Verifica si recibe algun argumento que no sea nulo if (!String.IsNullOrEmpty(valida[1])) { // Llama a la funcion que retornara un valor booleano if (Comandos.CdComand(valida[1])) { // Verifica si lo ingresado tiene comillas if (valida[1].Contains(" ")) { // Agrega el comando a la lista del historial history.Add(valida[0] + " \"" + valida[1] + "\""); } else { // Agrega el comando a la lista del historial history.Add(valida[0] + " " + valida[1]); } } } else { Console.WriteLine("Se debe especificar el directorio al que se quiere cambiar"); } } else { Console.WriteLine(valida[0]); } // Termina la ejecucion del bloque break; case "touch": // Valida que el comando escrito solo reciba 2 argumentos valida = Comandos.ValidaComando(comando, 2); // Si la primera palabra es el comando se ejecuta lo siguiente if (valida[0].Equals("touch")) { // Llama a la funcion que retornara un valor booleano if (Comandos.TouchComand(valida[1])) { // Agrega el comando a la lista del historial history.Add(valida[0] + " " + valida[1]); } } else { Console.WriteLine(valida[0]); } // Termina la ejecucion del bloque break; case "move": // Valida si el comando tiene comillas, las comillas son ingresadas para las // carpetas con espacios if (comando.Contains('"')) { // Valida que el comando escrito solo reciba 2 argumentos valida = Comandos.ValidaComando(comando, 2); // Separara el valor de valida[0] por los espacios string[] pal = Comandos.ValidaComando(valida[0], 2); // Si la primera palabra es el comando se ejecuta lo siguiente if (pal[0].Equals("move")) { // Llama a la funcion que retornara un valor booleano if (Comandos.MoveComand(pal[1], valida[1])) { // Agrega el comando a la lista del historial history.Add(pal[0] + " " + pal[1] + " \"" + valida[1] + "\""); } } else { Console.WriteLine(valida[0]); } } else { // Valida que el comando escrito solo reciba 3 argumentos valida = Comandos.ValidaComando(comando, 3); // Si la primera palabra es el comando se ejecuta lo siguiente if (valida[0].Equals("move")) { // Llama a la funcion que retornara un valor booleano if (Comandos.MoveComand(valida[1], valida[2])) { // Agrega el comando a la lista del historial history.Add(valida[0] + " " + valida[1] + " " + valida[2]); } } else { Console.WriteLine(valida[0]); } } // Termina la ejecucion del bloque break; case "history": // Agrega el comando a la lista del historial history.Add(palabras[0]); // Llama a la funcion que imprime el historial de comandos Comandos.HistoryCommand(history); break; case "cls": // Agrega el comando a la lista del historial history.Add(palabras[0]); // Limpia la pantalla Console.Clear(); // Termina la ejecucion del bloque break; case "exit": // La bandera se vuelve false y con eso termina el programa continua = false; // Termina la ejecucion del bloque break; default: Console.WriteLine("Comando '{0}' no existe", palabras[0]); // Termina la ejecucion del bloque break; } } while (continua); }