Desktop-Pfad herausfinden



  • Hallo,
    in meinen Programm soll eine simple .txt Datei mit ofstream erstellt werden, und zwar auf dem Desktop.
    Da das Programm nicht nur für mich sein soll, kann ich ja keinen festen Pfad angeben.
    Gibt es eine Funktion die den Pfad zurückgibt?

    ofstream out;
    out.open(0,L"/*Desktop*/");
    out.close;
    

    Hoffe ihr könnt mir helfen.
    MFG!



  • Hiermit bekommst du den Benutzernamen raus:

    std::string get_username() {
        char acUserName[100];
        DWORD nUserName = sizeof(acUserName);
        GetUserName(acUserName, &nUserName);
        std::string USERNAME(acUserName);
        return USERNAME;
    }
    

    Und dann kannst du ja lockerflockig das machen:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main() {
    	fstream datei;
    	string pfad = "C:/users/";
    	pfad += get_username(); //die funktion benutzen
    	pfad += "/desktop/datei.txt";
    	datei.open(pfad.c_str(), ios::out);
    	datei << "hi!";
    }
    

  • Mod

    Systemabhängig. In welches Betriebssytemforum darf ich dich verschieben?

    (Ja, ich kann mir denken dass du für Windows programmierst. Aber so musst du jetzt wenigstens darüber nachdenken was system(un)abhängige Programmierung bedeutet.)



  • "Desktop" ist auf verschiedenen Betriebssystemen anders definiert, auf manchen gibt es sogar gar keinen Desktop (bspw. in der ABS-Anlage meines Autos). Deswegen hat man bei C++ nur minimale Dateioperationen out-of-the-box dabei und kaum Interaktion mit dem Betriebssystem.

    Je nachdem auf welchem OS du operierst (Linux, Windows, etc.) können wir diesen Thread in ein passendes Forum schieben wo du eine passende Antwort bekommst (die dann aber natürlich auch nur auf dieser Plattform funktioniert).

    MfG SideWinder



  • Danke für die Antworten, ich bin auf Windows



  • Killur schrieb:

    Danke für die Antworten, ich bin auf Windows

    Gehört dann ins WINAPI forum.
    Mit dem Batch Befehl? %USERPROFILE% kannst du glaube ich den Desktoppfad herausfinden.
    Weis ich nicht mehr genau.

    Ansonsten :
    http://www.c-plusplus.net/forum/157945

    Gruss Sheldor



  • Sag mal ignoriert ihr mich? Meine Version ist viel besser als irgendein Batch-Zeugs und funktioniert einwandfrei. Hier, das kannst du sofort kompilieren:

    #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 main() {
    	fstream datei;
    	string pfad = "C:/users/";
    	pfad += get_username(); //die funktion benutzen
    	pfad += "/desktop/datei.txt";
    	datei.open(pfad.c_str(), ios::out);
    	datei << "hi!";
    }
    

    EDIT: Abgesehen davon ist das eine Umgebungsvariable und sie ist falsch, die richtige wäre %USERNAME%.



  • Incocnito schrieb:

    Hiermit bekommst du den Benutzernamen raus:

    einfacher geht es mit den umgebungsvariablen. da müsste eine sein mit namen %USERPROFILE% dann bist du im ordner C:\Users[Benutzername]
    dann kannst du es machen wie Incocnito es schon gesagt hat



  • @Incognito:

    1. Ist deine Version nicht gut, da sie nicht unter allen Windows-Versionen funktioniert.

    2. Mit %USERPROFILE% bekommt man den richtigen Ordner und muss nur noch "\Desktop" anhängen, das ist aber nur für Command-Line interessant und hier egal.

    3. Funktioniert das ganze bestimmt mit irgendeiner Windows-Shell-API-Funktion!

    Damit deine komische Lösung nicht genommen wird muss ich jetzt tatsächlich noch Google anwerfen. Damn.

    Die Lösung findet sich hier: http://weseetips.com/2008/05/01/how-to-get-the-path-of-special-folders-in-windows/

    MfG SideWinder



  • Incocnito schrieb:

    EDIT: Abgesehen davon ist das eine Umgebungsvariable und sie ist falsch, die richtige wäre %USERNAME%.

    Kann sein, ich weiss es nicht mehr genau wie das ging. (Habe ich auch hingeschrieben)

    Gruss Sheldor



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

    ofstream out;
    out.open("C:\\test.txt", ios::out);
    out.close();
    

    Wenn ich dan nachgucke ist kein test.txt da.
    Woran kann das liegen? Ich weis das gehört hier nicht dazu, aber dafür nen neune Thread aufmachen?...

    MFG!



  • Stimmt, %USERPROFILE% war doch ok, sorry. Wer sich die nochmal ansehen will einfach cmd - SET eingeben, dann hat man sie ja, oder man machts auf C++ Art und Weise und verwendet den dritten Parameter von main(int argc, char **argv, char **env). Damit kann man auch prima rumhantieren, eine Lösung sollte damit auch machbar sein. Nur blöd, das die Umgebungsvariablen bei jedem in Anzahl und Art anders sind..
    Hm, dann ist meine Version wohl veraltet. Aber sie sollte eigentlich auch funktionieren.



  • Die Version von Incognito wird dir auf einem deutschen Windows XP imho um die Ohren fliegen. Dort heißt der Ordner nämlich "C:\Dokumente und Einstlelungen\<Username>\Desktop"

    Gut möglich, dass dein Programm nur mit Administratorrechten direkt auf C: schreiben darf. Dagegen kannst du nichts machen, du musst dein Programm dann eben mit Admin-Rechten starten.

    MfG SideWinder



  • 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;
    }
    

Log in to reply