Si vas a utilizar C, o quizá un compilador de C++ GPL como a vos te gustan, podes hacer lo siguiente:
#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").
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:
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.
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