Desktop-Pfad herausfinden
-
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!"; }
-
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