Verzeichnis Icon zuweisen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Verzeichnis Icon zuweisen

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag 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
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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]
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Zuletzt geändert von Scarabol am 23.01.2007 15:49, insgesamt 1-mal geändert.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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.
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

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