Desktop-Pfad herausfinden



  • Incocnito schrieb:

    ...

    FYI: env ist eine Erweiterung des MSVC und ist kein "generelles C++" und damit auch nicht "auf C++ Art und Weise".

    Verwendet doch bitte einfach die von Microsoft vorgesehene Variante die in meinem Link beschrieben ist, danke.

    MfG SideWinder



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Killur schrieb:

    Die Version von Incognito geht perfekt, nur ist mir gerade aufgefallen das ich keine Datei auf c: erstellen kann.

    Schau mal unter Rechtsklick laufwerk c: -> Sicherheit, ob du schreibrechte hast.
    Kommt keine Fehlermeldung ? / Fängst du die Fehler ab ?

    Gruss Sheldor



  • Das muss mal eben einfach sein:

    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    string get_username() {
        char acUserName[100];
        DWORD nUserName = sizeof(acUserName);
        GetUserName(acUserName, &nUserName);
        string USERNAME(acUserName);
        return USERNAME;
    }
    
    int os()
    {
        OSVERSIONINFO osver;
        osver.dwOSVersionInfoSize = sizeof(osver);
        GetVersionEx(&osver);
    
        if(osver.dwMajorVersion == 5) return 1; //XP
        if(osver.dwMajorVersion == 6)
        if(osver.dwMinorVersion == 0) return 2; //vista
        if(osver.dwMinorVersion == 1) return 3; //windows 7
    
        return 0;
    }
    
    int main() {
    	fstream datei;
    	string pfad;
    	switch(os()) {
    		case 1:
    		pfad = "C:/Dokumente und Einstellungen/";
    		break;
    		case 2:
    		case 3:
    		pfad = "C:/users/";
    		break;
    	}
    	pfad += get_username(); //die funktion benutzen
    	pfad += "/desktop/datei.txt";
    	datei.open(pfad.c_str(), ios::out);
    	datei << "hi!";
    }
    

    😛


  • Mod

    Incocnito schrieb:

    Das muss mal eben einfach sein:

    Was? Unfug zu produzieren? 🕶

    1. Der Namen den GetUserName liefert und das Unterverzeichnis für den C:\Users Folder müssen nicht übereinstimmen. (Beispiel: 1. lokaler Benutzer Martinmeldet sich an, 2. Domänen Benutzer Martin meldet sich an.)
    2. Und wenn Windows 8 kommt geht es nicht mehr weil C:\Users wieder was anderes wird.
    3. Kann man das C:\Users Verzeichnis auf eine andere Platte verlegen.

    SideWinder hat bereits auf die Lösung mit SHGetSpecialFolderPath hingewiesen.
    Das ist IMHO der einzig richtige Weg.
    http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx



  • Incocnito schrieb:

    Das muss mal eben einfach sein:

    #include <iostream>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    string get_username() {
        char acUserName[100];
        DWORD nUserName = sizeof(acUserName);
        GetUserName(acUserName, &nUserName);
        string USERNAME(acUserName);
        return USERNAME;
    }
    
    int os()
    {
        OSVERSIONINFO osver;
        osver.dwOSVersionInfoSize = sizeof(osver);
        GetVersionEx(&osver);
    
        if(osver.dwMajorVersion == 5) return 1; //XP
        if(osver.dwMajorVersion == 6)
        if(osver.dwMinorVersion == 0) return 2; //vista
        if(osver.dwMinorVersion == 1) return 3; //windows 7
    
        return 0;
    }
    
    int main() {
    	fstream datei;
    	string pfad;
    	switch(os()) {
    		case 1:
    		pfad = "C:/Dokumente und Einstellungen/";
    		break;
    		case 2:
    		case 3:
    		pfad = "C:/users/";
    		break;
    	}
    	pfad += get_username(); //die funktion benutzen
    	pfad += "/desktop/datei.txt";
    	datei.open(pfad.c_str(), ios::out);
    	datei << "hi!";
    }
    

    😛

    Wenn ich mir im Gegenzug die Lösung von der verlinkten Seite von SideWinder anschaue:

    // String buffer for holding the path.
    TCHAR strPath[ MAX_PATH ];
    
    // Get the special folder path.
    SHGetSpecialFolderPath(
        0,       // Hwnd
        strPath, // String buffer.
        CSIDL_DESKTOPDIRECTORY, // CSLID of folder
        FALSE ); // Create if doesn't exists?
    

    finde ich diese besser^^. Vorteil ist, dass ich bei zukünftigen Win Versionen mein Programm wahrscheinlich nicht anpassen muss und es auch kürzer ist.



  • So geht's für Versionen auch vor XP / 2000:

    #include <windows.h>
    #include <shlobj.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	LPITEMIDLIST pIdList;
    	char path[MAX_PATH];
    
    	SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pIdList);
    	SHGetPathFromIDList(pIdList, path);
    
    	cout << "Pfad:\n" << path << endl;
    }
    


  • Ich wusste schon, dass das Quatsch ist. Viel zu groß und klobig. Aber es musste einfach sein 😉



  • Belli schrieb:

    So geht's für Versionen auch vor XP / 2000:

    ...
    	LPITEMIDLIST pIdList;
    	char path[MAX_PATH]	
    	SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pIdList);
    	SHGetPathFromIDList(pIdList, path);
    ...
    }
    

    Die Freigabe fehlt noch. Also entweder eine eigene kleine RAII-Klasse schreiben (die bessere Lösung) oder zumindest

    LPMALLOC Malloc;
    SHGetMalloc(&Malloc);
    if(Malloc)
    {
      Malloc->Free(pIdList);
      Malloc->Release();
    }
    


  • Danke euch allen, es geht jetzt 🙂


Anmelden zum Antworten