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. :wink:

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.

2Bisonte
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.... :oops:

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.