2009-05-01 11 views
9

¿Cómo puedo encontrar la letra del controlador del disco duro principal en un sistema operativo Windows?¿Cómo puedo obtener la letra de la unidad del sistema?

Es decir, la unidad con Program Files, System32, y así sucesivamente.

+1

No asuma que los programas estarán en "\ Archivos de programa", o archivos de sistema en "\ Windows \ System32" - hay llamadas de API para recuperar rutas exactas para éstas y más ... – Shog9

+0

¿Puede darme un ejemplo de una de esas llamadas API para que pueda investigarlas? Estoy buscando ciertos archivos asociados con los programas –

+0

http://msdn.microsoft.com/en-us/library/ms724373.aspx ... http://msdn.microsoft.com/es-es-es /library/bb762181.aspx – Shog9

Respuesta

4

La llamada API GetWindowsDirectory podría ser de ayuda. Puede analizar esta información usando las API para analizar la información de la letra de la unidad.

+0

** ¿Qué ** API usaría para "analizar más detenidamente" los resultados de 'GetWindowsDirectory()'? – unixman83

+0

Simplemente obtenga la primera letra de la ruta del directorio de Windows. –

22

Hay una variable de entorno llamada SystemDrive que está configurada en la unidad del sistema (sorprendentemente). La llamada getenv() es cómo puede llegar a ella.

char *sysDrive = getenv ("SystemDrive"); 
if (sysDrive == NULL) { 
    // vote me down. 
} else { 
    // vote me up and use it. 
} 

This page listas de toda una serie de variables de entorno disponibles si no se puede confiar en directorios específicos existentes en la unidad del sistema.

Como alternativa, use la llamada API de Windows, SHGetSpecialFolderPath(), y pase el CSIDL correcto. Entonces no deberías tener que depender de las variables de entorno.

Aunque tenga en cuenta en esas páginas que esto ha sido reemplazado por otras funciones en Vista (todavía debe funcionar, ya que esta función se convierte en un envoltorio alrededor de la nueva).

3

SYSTEMDRIVE

PROGRAMFILES

SYSTEMROOT

WINDIR

No asuma Archivos de programa es en la misma unidad como Windows. Por lo general es así. por lo general.

+2

Debe mencionar que los que están en mayúsculas son nombres para las variables de entorno de Windows. – unixman83

+0

_Por lo general_, ¿seguro? –

0

Nunca utilice variables env como en la respuesta incorrecta anterior.
variables de env son actualizables por el usuario.

+4

Claro, el usuario puede cambiar los valores de% WINDIR%, etc., pero el usuario también puede meterse con su registro, reemplazar todos los archivos de recursos de su aplicación con sus LOLCats o instalar Linux. Esas no son cosas para las que su aplicación necesita tener un plan de contingencia. – bsneeze

+0

@cali, entonces ** ¿qué debemos usar? Estoy de acuerdo en que las variables de entorno son propensas a errores. – unixman83

0

https://msdn.microsoft.com/en-us/library/ms724426.aspx

' vacío PrintError (TCHAR * msg) { DWORD ENUM; TCHAR sysMsg [256]; TCHAR * p; eNum = GetLastError(); FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ENUM, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), sysMsg, 256, NULL); // easilty se podría cambiar a /* FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), sysMsg, 256, NULL); */

// Trim the end of the line and terminate it with a null 
p = sysMsg; 
while((*p > 31) || (*p == 9)) ++p; 
do { *p-- = 0; } while((p >= sysMsg) && 
         ((*p == '.') || (*p < 33))); 
// Display the message 
_tprintf(TEXT("\n\t%s failed with error %d (%s)"), msg, eNum, sysMsg); 

} ' pero explica cómo obtener la información del sistema en profundidad en su mayor parte. muy informativo

+0

Por favor, vuelva a formatear su respuesta. – ThomasEdwin

+0

Necesita formatear la respuesta con etiquetas de código y saltos de línea. – Alan

Cuestiones relacionadas