Wie Datei auf Desktop schreiben?

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Wie Datei auf Desktop schreiben?

Beitrag 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"?
Zuletzt geändert von Syntacks_Error am 11.09.2009 13:38, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Umgebungsvariablen benutzen

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Wie Datei auf Desktop schreiben?

Beitrag 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
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Wie Datei auf Desktop schreiben?

Beitrag von Syntacks_Error »

Das ging ja flott ;-) Ahnte schon, daß man das anders machen muß, vielen Dank.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Wie Datei auf Desktop schreiben?

Beitrag von Sven »

Gibts dafür nicht auch GetEnvironmentVariable() als PB-eigenen Befehl?
Benutzeravatar
jojo1541
Beiträge: 431
Registriert: 15.09.2007 17:12
Wohnort: Irgendwo im Nirgendwo

Re: Wie Datei auf Desktop schreiben?

Beitrag von jojo1541 »

ja... <) aber ich bin ein APi-freak. auch wenn ich mich nich wirklich damit auskenne
Ich verkaufe Rechtschreibfehler und jede menge GROßBUCHSTABEN. Alles unbegrenzt zu haben.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Datei auf Desktop schreiben?

Beitrag 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
Zuletzt geändert von Bisonte am 15.12.2009 15:49, insgesamt 2-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Little John

Re: Wie Datei auf Desktop schreiben?

Beitrag 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
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Wie Datei auf Desktop schreiben?

Beitrag von Bisonte »

autsch .... jetzt wo du das so sagst, hab ich wohl ein # unterschlagen.... :oops:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Re: Wie Datei auf Desktop schreiben?

Beitrag 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.
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Antworten