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
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
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