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);
     }
 }
示例#2
0
        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);
        }