Seite 1 von 2
Wie Datei auf Desktop schreiben?
Verfasst: 11.09.2009 13:26
von Syntacks_Error
ich möchte eine Datei auf den Desktop schreiben. Dazu brauche ich das Verzeichnis, und ich dachte mir, suche ich halt das Verzeichnis mit "Desktop":
Code: Alles auswählen
Procedure.s finddesktop(dir$)
dir = ExamineDirectory(#PB_Any,dir$,"*.*")
While NextDirectoryEntry(dir)
If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
neudir$ = DirectoryEntryName(dir)
If neudir$ <> "." And neudir$ <> ".."
dir1$ = dir$ + neudir$ + "\"
If neudir$ = "Desktop"
Debug dir1$
ProcedureReturn(dir1$)
EndIf
If SetCurrentDirectory(dir1$) ; ohne Überprüfung crashts
finddesktop(dir1$)
EndIf
EndIf
EndIf
Wend
FinishDirectory(dir)
EndProcedure
dir1$ = finddesktop("c:\") ;gibt leider nichts aus
Debug "Return: " + dir1$
Klappt aber nicht, denn es gibt mehrere Verzeichnisse mit "Desktop" und auf einem anderen Computer weiß man ja nicht, welches das richtige ist. Außerdem scheint das mit "procedurereturn()" bei Rekursion nicht zu klappen.
Wie finde ich das aktuelle Desktopverzeichnis heraus? Daß der aktuelle Desktop die Nummer "0" hat, hilft auch nicht so recht ... Außerdem: Habe ich dann da nicht noch jede Menge offene "examinedirectory"?
Umgebungsvariablen benutzen
Verfasst: 11.09.2009 13:35
von Kaeru Gaman
du musst den aktuellen User ermitteln, dafür gibts ne Umgebungsvariable wenn ich mich nicht täusche.
der Ordner "Desktop" ist dann einfach eine Subdir, da musst du dir keinen Wolf examinen.
zu deinen anderen Problemen:
1. setze das ProcedureReturn erst am Ende der Proc.
2. werte den Rückgabewert des Rekursiven Aufrufs aus.
das aber nur fürs nächste Mal, wie gesagt, für diese Problemstellung brauchst du keine Rekursion.
Re: Wie Datei auf Desktop schreiben?
Verfasst: 11.09.2009 13:36
von jojo1541
Diese Procedure gibt dir den Pfad einer Umgebungsvariable aus:
Code: Alles auswählen
Procedure.s getuv(name.s)
value.s=Space(256)
size.l=Len(value)
GetEnvironmentVariable_(@name, @value, @size)
ProcedureReturn(value)
EndProcedure
zusammen mit der Umgebungsvariable "Homepath" gibt sie das Benutzerverzeichnis aus, z.B "C:\Dokumente und Einstellungen\Hans Mustermann"
jetzt hängst du da noch den Ordner Desktop dran, und fertig.
Beispiel:
Code: Alles auswählen
EnableExplicit
Global teststring.s
Procedure.s getuv(name.s)
Define value.s
Define size.l
value.s=Space(256)
size.l=Len(value)
GetEnvironmentVariable_(@name, @value, @size)
ProcedureReturn(value)
EndProcedure
teststring = getuv("Homepath") + "\Desktop"
Debug teststring
Re: Wie Datei auf Desktop schreiben?
Verfasst: 11.09.2009 13:39
von Syntacks_Error
Das ging ja flott

Ahnte schon, daß man das anders machen muß, vielen Dank.
Re: Wie Datei auf Desktop schreiben?
Verfasst: 11.09.2009 14:10
von Sven
Gibts dafür nicht auch GetEnvironmentVariable() als PB-eigenen Befehl?
Re: Wie Datei auf Desktop schreiben?
Verfasst: 11.09.2009 14:52
von jojo1541
ja...

aber ich bin ein APi-freak.
auch wenn ich mich nich wirklich damit auskenne
Re: Wie Datei auf Desktop schreiben?
Verfasst: 12.09.2009 06:10
von Bisonte
oder so....
Code: Alles auswählen
Procedure.s GetSpecialFolder(CSIDL)
Protected *itemid.ITEMIDLIST
Protected location.s = Space(#MAX_PATH)
If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
If SHGetPathFromIDList_(*itemid, @location)
CoTaskMemFree_(*itemid)
If Right(location, 1) <> "\" : location + "\" : EndIf
ProcedureReturn location
EndIf
EndIf
; Liste zuden Konstanten: http://msdn.microsoft.com/en-us/library/bb762494.aspx
EndProcedure
Debug GetSpecialFolder(#CSIDL_DESKTOP)
Edit : "Schönheitsfehler" korrigiert
Re: Wie Datei auf Desktop schreiben?
Verfasst: 12.09.2009 16:39
von Little John
Syntacks_Error hat geschrieben:Außerdem scheint das mit "procedurereturn()" bei Rekursion nicht zu klappen.
Kommt drauf an, wo
ProcedureReturn steht, und ob die rekursiven Aufrufe insgesamt in Ordnung sind. Kaeru Gaman hat ja schon was dazu geschrieben. Hier gibt es
mehr Informationen über Rekursion.
Bisonte hat geschrieben:oder so....
Code: Alles auswählen
Procedure.s GetSpecialFolder(CSIDL)
Protected *itemid.ITEMIDLIST
Protected location.s = Space(#MAX_PATH)
If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
If SHGetPathFromIDList_(*itemid, @location)
CoTaskMemFree_(*itemid)
If Right(location, 1) <> "\" : location + "\" : EndIf
ProcedureReturn location
EndIf
EndIf
; Liste zuden Konstanten: http://msdn.microsoft.com/en-us/library/bb762494.aspx
EndProcedure
Debug GetSpecialFolder(CSIDL_DESKTOP)
Das ist IMHO von den hier gegebenen Antworten die einzige "wasserdichte" Methode. Schon allein deshalb, weil man meines Wissens nicht voraussetzen kann, dass das Desktopverzeichnis am Ende zwangsläufig "Desktop" heißt.
2
Bisonte
Kleiner Schönheitsfehler: Die Konstante heißt
#CSIDL_DESKTOP. Mit
EnableExplicit am Anfang des Codes merkt man den Unterschied.
( Ohne EnableExplicit fällts in diesem Fall nicht auf, weil die Konstante #CSIDL_DESKTOP den Wert 0 und damit den gleichen Wert wie die nicht initialisierte Variable CSIDL_DESKTOP hat. )
Gruß, Little John
Re: Wie Datei auf Desktop schreiben?
Verfasst: 13.09.2009 03:05
von Bisonte
autsch .... jetzt wo du das so sagst, hab ich wohl ein # unterschlagen....

Re: Wie Datei auf Desktop schreiben?
Verfasst: 15.12.2009 04:17
von KatSeiko
Danke!
CSIDL_DESKTOP (FOLDERID_Desktop)
The virtual folder that represents the Windows desktop, the root of the namespace.
CSIDL_DESKTOPDIRECTORY (FOLDERID_Desktop)
The file system directory used to physically store file objects on the desktop (not to be confused with the desktop folder itself). A typical path is C:\Documents and Settings\username\Desktop.
Demnach sollte man wohl besser #CSIDL_DESKTOPDIRECTORY statt #CSIDL_DESKTOP verwenden...
An dieser Stelle auch hilfreich: #CSIDL_COMMON_DESKTOPDIRECTORY liefert das Verzeichnis für alle User.