Seite 1 von 2

Verzeichnis Icon zuweisen

Verfasst: 22.01.2007 18:07
von Scarabol
Hallo Leute,

Wie kann man unter Windows den Verzeichnissen (Ordnern) ein Symbol zuweisen?

Kann man sowas auch mit API oder sogar PB intern machen?

Gruß
Scarabol

Verfasst: 22.01.2007 18:21
von TomS
Geht PB-Intern.

Musst in dem Ordner ne Datei erstellen. "Desktop.ini"
und das hier reinschreiben

Code: Alles auswählen

[.ShellClassInfo]
IconFile=pfad_zu_icon.ico
IconIndex=0
MfG, TomS

Verfasst: 22.01.2007 18:30
von Scarabol
Habs versucht funktioniert aber leider nicht, wieso?

Code: Alles auswählen

Dir$ = "P:\Purebasic\"
File$ = "P:\Purebasic\PBIcon.ico"

If ReadFile(1, Dir$+"Desktop.ini")
  MessageRequester("info", "info")
  End
Else
  If CreateFile(1, Dir$+"Desktop.ini")
    WriteStringN(1, "[.ShellClassInfo]")
    WriteStringN(1, "IconFile="+File$)
    WriteStringN(1, "IconIndex=0")
    CloseFile(1)
    End
  Else
    Debug "Error"
  EndIf
EndIf
[Edit]
Das Icon stammt zwar von mir hab aber mal ne Desktop.ini aus nem anderen Ordner kopiert, bei dem es funktioniert, aber es funktioniert trotzdem nicht.

Kann es sein das ich die Datei irgendwie Systemintern registrieren muss?
[/Edit]

Verfasst: 22.01.2007 22:10
von Sicro
Hallo Scarabol,

du musst dem Verzeichnis, indem die "Desktop.ini" ist, das System-Attribut setzen:

Code: Alles auswählen

SetFileAttributes("P:\Purebasic",#PB_FileSystem_System)
Mfg DerProgger

Verfasst: 23.01.2007 14:21
von Scarabol
Vielen Dank Leute!

Es funktioniert alles und ich hab das ganze mal in ne Procedure gepackt.

Code: Alles auswählen

Procedure SetDirectoryIcon(Directory$, Icon$)
; ©2007 by Scarabol
  SetFileAttributes(Directory$, #PB_FileSystem_Hidden|#PB_FileSystem_System|#PB_FileSystem_Archive)
  File1 = ReadFile(#PB_Any, Directory$+"Desktop.ini")
  If File1
    FileName$ = GetTemporaryDirectory()+"Temp_Desktop+"+RSet(Str(Random(999)), 3, " ")+".ini"
    File2 = CreateFile(#PB_Any, FileName$)
    While Eof(File1) = 0
      String$ = ReadString(File1)
      If FindString(String$, "IconFile", 0)
        WriteStringN(File2, "IconFile="+Icon$)
      Else
        WriteStringN(File2, String$)
      EndIf
    Wend
    CloseFile(File2)
    CloseFile(File1)
    DeleteFile(Directory$+"Desktop.ini")
    RenameFile(FileName$, Directory$+"Desktop.ini")
    ProcedureReturn 1
  Else
    File1 = CreateFile(#PB_Any, Directory$+"Desktop.ini")
    If File1
      WriteStringN(File1, "[.ShellClassInfo]")
      WriteStringN(File1, "IconFile="+Icon$)
      WriteStringN(File1, "IconIndex=0")
      CloseFile(File1)
    Else
      ProcedureReturn 0
    EndIf
  EndIf
EndProcedure

SetDirectoryIcon("P:\Purebasic\", "P:\Purebasic\PBIcon.ico")
Gruß
Scarabol

Verfasst: 23.01.2007 14:36
von Kaeru Gaman
DerProgger hat geschrieben:Hallo Scarabol,

du musst dem Verzeichnis, indem die "Desktop.ini" ist, das System-Attribut setzen:

Code: Alles auswählen

SetFileAttributes("P:\Purebasic",#PB_FileSystem_System)
Mfg DerProgger
aaah.. cool. danke für den hinweis.

..das hatte mir noch gefehlt, um aus einfachen ordnern richtige Bildordner zu machen,
wie der ordner "Eigene Bilder" mit großem vorschaufenster und so.
das gind auch über die Desktop.ini, und funktionierte auch nich überall,
wahrscheinlich weil das system-flag fehlte.

Verfasst: 23.01.2007 15:07
von ts-soft
Korrekt ist das aber nicht :wink:
Ordner werden nur ReadOnly gesetzt, System kann man dort nicht setzen.
Windows ändert das aber automatisch.

Etwas kürzer:

Code: Alles auswählen

Procedure SetDirectoryIcon(Dir.s, Icon.s)
  SetFileAttributes(Dir, #PB_FileSystem_ReadOnly)
  DeleteFile(Dir + "Desktop.ini")
  If CreatePreferences(Dir + "Desktop.ini")
    PreferenceGroup(".ShellClassInfo")
    WritePreferenceString("IconFile", Icon)
    WritePreferenceLong("IconIndex", 0)
    ClosePreferences()
    SetFileAttributes(Dir + "Desktop.ini", #PB_FileSystem_Hidden|#PB_FileSystem_System|#PB_FileSystem_Archive)
  EndIf
EndProcedure
Hier kriegt die Desktop.ini auch gleich die passenden Attribute verpasst.

Gruß
Thomas

Verfasst: 23.01.2007 15:51
von Scarabol
@TS-Soft
Schön und gut das es etwas kürzer ist kann aber auch gefährlich sein, da alle bestehenden Infos gelöscht werden.

Verfasst: 23.01.2007 16:30
von ts-soft
Kann man ja anpassen mit OpenPreference, wenns nicht klappt create :wink:
Aber das Systemflag für Ordner ist verkehrt, ReadOnly ist korrekt

Code: Alles auswählen

Procedure SetDirectoryIcon(Dir.s, Icon.s)
  SetFileAttributes(Dir, #PB_FileSystem_ReadOnly)
  If Not OpenPreferences(Dir + "Desktop.ini")
    CreatePreferences(Dir + "Desktop.ini")
  EndIf
  PreferenceGroup(".ShellClassInfo")
  WritePreferenceString("IconFile", Icon)
  WritePreferenceLong("IconIndex", 0)
  ClosePreferences()
EndProcedure

Verfasst: 23.01.2007 19:07
von Sicro
ts-soft hat geschrieben:Aber das Systemflag für Ordner ist verkehrt, ReadOnly ist korrekt
Use the following procedure to customize a folder's style with Desktop.ini:

* Use PathMakeSystemFolder to make the folder a system folder. You can also make a folder a system folder from the command line by using attrib +s FolderName.
* Create a Desktop.ini file for the folder. You should mark it as hidden and read-only to protect it from being modified.

Quelle: Klick
Das ReadOnly-Attribut funktioniert aber auch :)

Mfg DerProgger