Dev - C++ - ayuda con programa de comandos

   
Vista:

ayuda con programa de comandos

Publicado por ricardo (1 intervención) el 29/05/2014 22:55:25
Hola comunidad, tengo aqui un pequeño prompt de comando.
En la ultimo antes del main tengo dos funciones resaltadas en negrita, una crea un directorio y la otra lo elimina pero no lo hacen con un nombre digitado por pantalla si no con uno fijo que yo le di "ruta" Alguna ayuda para que yo pueda darle el nombre al directorio que se valla a crear o eliminar, haciendo uso de los comando del programa.
Muchas gracias cualquier ayuda....


#include <iostream>
#include <string>
#include <direct.h>
#include <vector>
#include <fstream>
#include <stdio.h>
#include <windows.h>

using namespace std;


//Devuelve una subcadena indicando una posicion inicial y un caracter delimitador.
string subCadena(string cadena, int pos, char caracter) {
string subcadena = "";
while (cadena[pos] != caracter) {
subcadena += cadena[pos++];
if (pos >= cadena.size())
break;
}
return subcadena;
}

//Dado un string, le quita la primera palabra que es el comando y separa los parametros, los almacena en un vector y lo devuelve.
vector<string> separaAtributos(string lectura) {

vector<string>atributos;
atributos.clear();
string atributo;
for (int i = 0; i < lectura.length(); i++) {
if (lectura[i] == ' ') {
if (lectura[i + 1] != ' ') {
atributo = subCadena(lectura, i + 1, ' ');
atributos.push_back(atributo);
}
}
}
return atributos;
}

//Despliega la ayuda donde explica cada uno de los comandos.
void ayuda(vector<string>atributos) {
string atributo;
if (atributos.size() == 0) {
cout << endl << "[AYUDA GENERAL]" << endl << "Para obtener ayuda de un comando especifico teclee ayuda + comando " << endl;
cout << "[Comandos]" << endl << "- Cambia" << endl << "- Copia" << endl << "- Borra" << endl << "- Renombra" << endl;
cout << "- Lista" << endl << "- Muestra" << endl << "- Crea" << endl << "- Elimina"<< endl << "- Actual"<< endl << "- Salir"<< endl << endl;
} else {
while (!atributos.empty()) {
atributo = atributos.back();
atributos.pop_back();
if (atributo == "cambia") {
cout << endl << "Comando [cambia]" << endl << "Despliega el nombre de un directorio o se cambia a otro especificado" << endl;
cout << "Ejemplo: cambia C:/Carpeta" << endl << endl ;
return;
} else if (atributo == "copia") {
cout << endl << "Comando [copia]" << endl << "Copia el contenido de un archivo a otro" << endl;
cout << "Ejemplo: copia archivo1.txt archivoNuevo.txt" << endl << endl;
return;
} else if (atributo == "borra") {
cout << endl << "Comando [borra]" << endl << "Elimina un archivo" << endl;
cout << "Ejemplo: borra archivo.txt" << endl << endl;
return;
} else if (atributo == "renombra") {
cout << endl << "Comando [renombra]" << endl << "Cambia el nombre de un archivo" << endl;
cout << "Ejemplo: renombra viejo.txt nuevo.txt " << endl << endl;
return;
} else if (atributo == "lista") {
cout << endl << "Comando [lista]" << endl << "Despliega el contenido de un directorio" << endl;
cout << "Ejemplo: lista (sin argumentos)" << endl << endl;
return;
} else if (atributo == "muestra") {
cout << endl << "Comando [muestra]" << endl << "Despliega por bloques en pantalla el contenido de un archivo" << endl;
cout << "Ejemplo: muestra archivo.txt" << endl << endl;
return;
} else if (atributo == "crea") {
cout << endl << "Comando [crea]" << endl << "Crea un directorio en la ruta en la que se encuentre ubicado" << endl;
cout << "Ejemplo: crea + enter luego el nombre de el directorio que desea crear" << endl << endl;
return;
} else if (atributo == "elimina") {
cout << endl << "Comando [elimina]" << endl << "elimina un directorio en la ruta en la que se encuentre ubicado" << endl;
cout << "Ejemplo: elimina + enter luego el nombre de el directorio que desea eliminar" << endl << endl;
return;
} else if (atributo == "actual") {
cout << endl << "Comando [actual]" << endl << "muestra la ruta donde se encuentra ubicado" << endl;
cout << "Ejemplo: actual + enter" << endl << endl;
return;
} else {
cout << endl << "[ Error: Atributo " << atributo << " no identificado ]" << endl;
}
}
}
}

//Cambia de directorio
void cambia(vector<string> atributos) {
string ruta = "";
if (atributos.empty()) {
cout << endl << "Error: Debes indicar una ruta valida" << endl << endl;
} else {
char path[100];
for (int c = 0; c < atributos.size(); c++)
ruta += atributos[c] + " ";
strcpy(path, ruta.c_str());
chdir(path); //llamamos a la funcion chdir, la cual hace el cambio de directorio segun le indiquemos.
}
}

//Copia un archivo a otro.
void copia(vector<string>atributos) {
char oldfile[20], newfile[20], aux[100];
if (atributos.size() > 2) {
cout << endl << "Error: Se han detectado mas de dos parametros , verifique que los nombres de archivo no contengan espacios." << endl << endl;
} else if (atributos.size() <= 1) {
cout << endl << "Error: Cantidad de parametros incorrecta. Vea ayuda + copia para mas informacion" << endl << endl;
} else {
strcpy(oldfile, atributos[0].c_str());
strcpy(newfile, atributos[1].c_str()); //Convertimos de string a char.
ifstream viejo(oldfile, ifstream::in);
ofstream nuevo(newfile, ofstream::out);
while (!viejo.eof()) {
viejo.getline(aux, 100);
nuevo << aux << endl;
}
cout << endl << "Archivo copiado exitosamente!!" << endl << endl;
}
}

//Elimina un archivo
void borra(vector<string>atributos) {
char file[20];
if (atributos.size() != 1) {
cout << endl << "Error: Cantidad de parametros incorrectos. Vea ayuda + borra para mas informacion. " << endl << endl;
} else {
strcpy(file, atributos[0].c_str()); //Convertimos de string a char.
if (remove(file) != 0)
cout << endl << "No se pudo eliminar el archivo. " << endl << endl;
else
cout << endl << "Archivo eliminado exitosamente! " << endl << endl;
}
}

//Renombra un archivo
void renombra(vector<string>atributos) {
if (atributos.size() != 2) {
cout << endl << "Error: Cantidad de parametros incorrecta. Verifique que los nombres de archivo no contengan espacios." << endl << endl;
} else {
copia(atributos);
atributos.pop_back();
borra(atributos);
cout << endl << "Archivo renombrado exitosamente!! " << endl << endl;
}
}

//Muestra un archivo por bloques en pantalla.
void muestra(vector<string>atributos) {

if (atributos.size() != 1) {
cout << endl << "Cantidad de parametros incorrecta. Vea ayuda + muestra para mas informacion. " << endl << endl;
} else {
char archivo[20], aux[100];
int c = 0;
strcpy(archivo, atributos[0].c_str()); //Convertimos de string a char.
ifstream fichero(archivo, ifstream::in);
if (fichero.is_open()) {
while (!fichero.eof()) {
fichero.getline(aux, 100);
cout << aux << endl;
if (c++ % 3 == 0) {
system("pause");
}
}
}
}
}

void crea(vector<string>atributos)
{
char ruta[255];
system("mkdir ruta");
system("cls");
cout << endl<< "El directorio fue creado\n" << endl << endl;

}

void elimina(vector<string>atributos)
{
char ruta[255];
system("rmdir ruta ");
system("cls");
cout << endl<< "El directorio fue eliminado\n" << endl << endl;

}


int main() {

string lectura = "";
string comando = "";

vector<string>atributos; //Vector donde almacenaremos los atributos o parametros de un comando.
char directorio[100]; //Aqui guardamos el directorio actual donde nos encontramos.

do {
getcwd(directorio, 100); //Llamando a la funcion getcwd nos devuelve el current path, directorio actual.
cout << directorio << ">"; //Imprimimos en pantalla el directorio.
getline(cin, lectura); //Leemos desde teclado y lo almacenamos en "lectura".
atributos = separaAtributos(lectura); //Separamos los atributos de la lectura. Y los almacenamos en el vector atributos.
comando = subCadena(lectura, 0, ' '); //Extraemos de la lectura la primera palabra que ser&#65533; el comando.

//Verificamos si la variable comando es igual a uno de nuestros comandos...
if (comando == "ayuda")
ayuda(atributos); //LLamamos al m&#65533;todo segun corresponda, pasandole como par&#65533;metro el vector atributos.
else if (comando == "cambia") //Cada metodo se encarga de tratar al vector atributos como sea su conveniencia.
cambia(atributos); //Aqu&#65533; unicamente le pasamos el vector con los parametros almacenados en
else if (comando == "copia") //cada espacio de memoria.
copia(atributos);
else if (comando == "lista")
system("dir");
else if (comando == "renombra")
renombra(atributos);
else if (comando == "borra")
borra(atributos);
else if (comando == "muestra")
muestra(atributos);
else if (comando == "crea")
crea (atributos);
else if (comando == "elimina")
elimina (atributos);
else if (comando == "actual")
system("pwd");
else
cout << endl << "Comando " << comando << " no identificado. Reintente." << endl << endl;

} while (comando != "salir");

system("exit");
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

ayuda con programa de comandos

Publicado por vangodp (287 intervenciones) el 30/05/2014 04:44:56
Que te parece esta solucion?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <direct.h>
 
void crea ( std::string ruta ) {
	if ( mkdir( ruta.c_str() )    == 0 ) {
		std::cout << "Carpeta creada correctamente!: " << ruta.c_str() << std::endl ;
	}
	else {
	    std::cout << "Error! No se ha podido crear la carpeta: " << ruta.c_str() << " \nEs pocible que la carpeta ya exista o no tengas permisos para crearla..." << std::endl ;
	}
}
 
void borra( std::string ruta ) {
    if ( rmdir(ruta.c_str()) == 0 ){
        std::cout << "La carpeta se elimino correctamente!: " << ruta.c_str() << std::endl ;
    }
    else {
	    std::cout << "Error! No se ha podido borrar la carpeta: " << ruta.c_str() << " \nEs pocible que la carpeta no exista o no tengas permisos para borrarla..." << std::endl ;
	}
}
 
int main () {
    std::string ruta = "c:/prueba/MiCarpeta";
 
	crea ( ruta );
 
	std::cin.get();
	borra( ruta );
 
	return 0;
}

El único problema es que si usas c++11 u otros estandares te va tirar un error diciendo no se que de la libreria io.h un bug en toda la regla del compilador mingw.
Te va abrir el io.h y te va indicar una linea que es esta:
1
2
__CRT_INLINE off64_t lseek64 (int, off64_t, int);
__CRT_INLINE off64_t lseek64 (int fd, off64_t offset, int whence) {
Pues lo que debes hacer es poner guion bajo delante de todos los off64_t que veas ahi dejandolo asi:
1
2
__CRT_INLINE _off64_t lseek64 (int, _off64_t, int);
__CRT_INLINE _off64_t lseek64 (int fd, _off64_t offset, int whence) {

He encontrado una pagina que dice que es un bug de mingw al trabajar con -ansi, -std=c++11, -std=c++03 and -std=c++98

Si lo haces en c no te da error y si lo haces en c++ estandar sin los estandares antes mensionados pues te va a ir todo correcto.El problema es que tira errores parecidos a ese: cpp dir.h error: 'off64_t' does not name a type
Y la unica solucion que encontre fue la de poner el guion.
Lo bueno de eso que aparte de crear la carpeta te hace una comprobación.
Te aconsejo que si vas a modificar el io.h para hacer lo que dije has una copia por si las moscas ;)
Otra cosa es que este no es el único medio de hacerlo, ya sabes...C++ tiene siempre muchas formas de hacer lo mismo. Si no te gusta sigue buscando :D
La discucion sobre el bug esta aqui:
http://sourceforge.net/p/mingw/bugs/2024/

Si tienes mas problemas sigue preguntando ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

ayuda con programa de comandos

Publicado por vangodp (287 intervenciones) el 30/05/2014 09:28:00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <sstream>      // std::stringstream
#include <windows.h>
using namespace std;
 
void foo ( std::string comando ){
	system ( comando.c_str() );
	cout << "Se ha realisado la operacion solicitada" << endl;
}
 
int main (){
    int opt;
    string ruta;
    string carpeta;
    stringstream ss;
 
	cout << "1-crear carpeta\n2-borrar carpeta" << endl;
	opt = cin.get();
 
	switch (opt) {
	    case '1':
	        cout << "Entre con la ruta: " << endl;
	        cin>>ruta;
	        cout << "Nombre de la carpeta a crear" << endl;
	        cin>>carpeta;
            ss << "mkdir "<< ruta << "\\" << carpeta;
            foo( ss.str() );
	        break;
	    case '2':
	        cout << "Entre con la ruta: " << endl;
	        cin>>ruta;
	        cout << "Nombre de la carpeta a borrar" << endl;
	        cin>>carpeta;
            ss << "rmdir "<< ruta << "\\" << carpeta;
            foo( ss.str() );
	        break;
	    default:
	        break;
	}
 
    cin.ignore();
    return 0;
}

Este también te puede servir ya que usa el system como querías
Hay muchas formas de montar eso.
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

ayuda con programa de comandos

Publicado por ricard (1 intervención) el 30/05/2014 16:38:10
muchas gracias vangodp.
me sirvio mucho tu aporte ya logre terminar mi programa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar