2009-05-01 18 views
9

Wie finde ich den Treiberbrief der Hauptfestplatte auf einem Windows-Betriebssystem?Wie kann ich den Systemlaufwerkbuchstaben erhalten?

Das heißt, das Laufwerk mit Program Files, System32, und so weiter.

+1

Gehen Sie nicht davon aus, dass Programme in "\ Programme" oder Systemdateien in "\ Windows \ System32" enthalten sind - es gibt API-Aufrufe, um genaue Pfade für diese und mehr zu erhalten ... – Shog9

+0

Können Sie mir ein Beispiel für einen dieser API-Aufrufe geben, damit ich sie recherchieren kann? Ich möchte bestimmte Dateien mit Programmen –

+0

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

Antwort

4

Die API Call GetWindowsDirectory könnte hilfreich sein. Sie können diese Informationen mithilfe von APIs weiter analysieren, um die Informationen zum Laufwerksbuchstaben zu analysieren.

+0

** Welche ** APIs würde ich verwenden, um die 'GetWindowsDirectory()' Ergebnisse "weiter zu analysieren"? – unixman83

+0

Holen Sie sich den ersten Buchstaben des Windows-Verzeichnispfads. –

22

Es gibt eine Umgebungsvariable namens SystemDrive, die (überraschend) auf das Systemlaufwerk gesetzt ist. Der getenv() Anruf ist, wie Sie dazu kommen können.

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

This page listet eine ganze Reihe von Umgebungsvariablen zur Verfügung, wenn Sie nicht auf bestimmte Verzeichnisse bestehenden auf dem Systemlaufwerk verlassen können.

Alternativ können Sie den Windows-API-Aufruf SHGetSpecialFolderPath() verwenden und die korrekte CSIDL übergeben. Dann sollten Sie sich nicht auf die Umgebungsvariablen verlassen müssen.

Beachten Sie auf diesen Seiten, dass dies durch andere Funktionen in Vista ersetzt wurde (es sollte immer noch funktionieren, da diese Funktion ein Wrapper um den neuen wird).

3

SYSTEM

PROGRAMME

SYSTEMROOT

WINDIR

Sie auf dem gleichen Laufwerk wie Windows kann nicht davon ausgehen, Program Files ist. Es ist normalerweise. Normalerweise.

+2

Sie sollten erwähnen, dass diese in Großbuchstaben Namen für Windows-Umgebungsvariablen sind. – unixman83

+0

_Usually_, sicher? –

0

Verwenden Sie niemals Env-Variablen wie in der falschen Antwort oben.
env-Variablen können vom Benutzer aktualisiert werden.

+4

Sicher, der Benutzer kann die Werte von% WINDIR% usw. ändern, aber der Benutzer kann sich auch mit seiner Registrierung anlegen, alle Ressourcendateien seiner Anwendung durch seine LOLCats ersetzen oder Linux installieren. Das sind wirklich keine Dinge, für die Ihre App einen Notfallplan haben muss. – bsneeze

+0

@cali dann ** was ** sollten wir verwenden? Ich stimme zu, dass Umgebungsvariablen fehleranfällig sind. – unixman83

0

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

' Leere print (TCHAR * msg) { DWORD ENUM; TCHAR-System [256]; TCHAR * p; eNum = GetLastError(); Format (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ENUM MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), SYSMSG, 256, NULL); // easilty geändert werden könnten, um /* Format (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); 

} ' , aber es erklärt, wie man die Systeminformationen zum größten Teil in die Tiefe bekommen. sehr informativ

+0

Bitte formatieren Sie Ihre Antwort neu. – ThomasEdwin

+0

Sie müssen die Antwort mit Code-Tags und Zeilenumbrüchen formatieren. – Alan

Verwandte Themen