Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: Comandos DOS en c  (Leído 553 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Marian0
Genius
******

Prestigio: 0
Desconectado Desconectado

Sexo: Masculino
Mensajes: 27



WWW
« en: 15/03/2007, 09:23:34 »

Que tal, quería saber si alguno sabe como hacer para correr comandos de DOS en una aplicación c++.
Suponte, en determinado evento que cree una carpeta "md Carpeta" y que luego copie todo mis documentos a la carpeta con copy.
Sino, de qué otra forma lo podría hacer?

Saludos


Marian0
En línea


CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #1 en: 15/03/2007, 19:12:41 »

Si vas a utilizar C, o quizá un compilador de C++ GPL como a vos te gustan, podes hacer lo siguiente:

Código:
#include<windows.h>

int main(void){
system("echo Listado de directorios en el directorio actual");
system("echo ----------------------------------------------");
system("dir /AD");
system("echo Que tengas un buen día");
return 0;
}

Obteniendo los resultados por la salida estandar (ésto es una suerte de archivo "bat compilado").

Citar
Listado de directorios en el directorio actual
----------------------------------------------
 El volumen de la unidad D no tiene etiqueta.
 El número de serie del volumen es: B816-301C

 Directorio de D:\development\system

15/03/2007  06:41 p.m.    <DIR>          .
15/03/2007  06:41 p.m.    <DIR>          ..
15/03/2007  06:42 p.m.    <DIR>          Debug
               0 archivos              0 bytes
               3 dirs   1.623.244.800 bytes libres
Que tengas un buen día


Terminated with return code 0
Press any key to continue ...

Ahora bien, tratar de hacer esto en C++ Builder hace que se ejecute una ventana CMD para realizar las acciones y eso no suele ser el comportamiento deseado.
Además, teniendo a C++ de tu lado no creo que sea necesario recurrir al shell para realizar este tipo de tareas.

Entonces si tomamos C++ Builder como la plataforma de trabajo, para crear una carpeta, buscar archivos, copiarlos, etc. se utilizan funciones (casi todas wrappers de llamadas al sistema) declaradas en la cabecera winbase.h.

Por ejemplo tenemos la función:

Código:
BOOL CreateDirectory(
    LPCTSTR lpPathName, // pointer to a directory path string
    LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to a security descriptor
   );

Toma dos parámetros a saber. El primero un puntero a string terminado en null (\0) conteniendo el path del directorio a crear. Este string está limitado por la constante MAX_PATH. Para evitar esta limitación se puede utilizar la función CreateDirectoryW aunque solo en sistemas NT.
El segundo parámetro es un puntero a una estructura SECURITY_ATTRIBUTES.

Código:
typedef struct _SECURITY_ATTRIBUTES { // sa 
    DWORD  nLength;
    LPVOID lpSecurityDescriptor;
    BOOL   bInheritHandle;
} SECURITY_ATTRIBUTES;

Podes obviarla enviandole NULL, salvo que quieras recuperar el descriptor para realizar otros procesos. Si envias un puntero a dicha estructura, seteale la longitud apropiadamente.
Por último retorna un número distinto de cero si la ejecución fue exitosa, cero en caso contrario.

Al ser ésta una función del sistema operativo debes tener en cuanta que en sistemas NT se comportará diferente que en sistemas win32 como Windows98. Sobre todo si el sistema de archivo es FAT, FAT32 o NTFS.
Personalmente no me gustan los fallos en funciones API, por lo que me aseguro de verificar que el entorno sea adecuado para su ejecución. En este caso por ejemplo, sería bueno verificar que el directorio a crear no exista actualmente.

Adicionalmente existe otra función, CreateDirectoryEx, que permite que el nuevo directorio a crear herede los atributos (atributos como oculto, sistema, etc) de otro ya existente.

Espero que te sirva.

Saludos.

PD: Parte de la información que puede contener el descriptor de seguridad es la siguiente:

  • An owner (SID)
  • A primary group (SID)
  • A discretionary ACL
  • A system ACL
  • Qualifiers for the preceding items
En línea

Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: