SetDirectoryAttributes()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Knight_Rider_2000
Beiträge: 145
Registriert: 05.02.2007 20:46
Kontaktdaten:

SetDirectoryAttributes()

Beitrag von Knight_Rider_2000 »

Code: Alles auswählen

;Dies ist eine Funktion die in der FileSystem Library nicht beachtet wurde wo es nur SetFileAttribute() gibt.
;Ich denke jeder sollte von meiner Konstruktion etwas haben.
;Folgene Attribute können genutzt werden
;  #PB_FileSystem_Hidden     : Verzeichnis wird versteckt
;  #PB_FileSystem_Archive    : Verzeichnis wird archiviert
;  #PB_FileSystem_Compressed : Verzeichnis wird komprimiert
;  #PB_FileSystem_Normal     : Verzeichnis erhält die Normalen Attribute
;  #PB_FileSystem_ReadOnly   : Verzeichnis wird zum "ReadOnly" Modus (schreibgeschützt)
;Es können natürlich noch weitere Windowskonstanten genutzt werden was ich eher empfehle als die 
;PB Konstanten
;  Windows Konstanten             PB Konstanten               Wirkung
;  #FILE_ATTRIBUTE_HIDDEN     =   #PB_FileSystem_Hidden     : Verzeichnis wird versteckt
;  #FILE_ATTRIBUTE_ARCHIVE    =   #PB_FileSystem_Archive    : Verzeichnis wird archiviert
;  #FILE_ATTRIBUTE_COMPRESSED =   #PB_FileSystem_Compressed : Verzeichnis wird komprimiert
;  #FILE_ATTRIBUTE_NORMAL     =   #PB_FileSystem_Normal     : Verzeichnis erhält die Normalen Attribute
;  #FILE_ATTRIBUTE_READONLY   =   #PB_FileSystem_ReadOnly   : Verzeichnis wird zum "ReadOnly" Modus (schreibgeschützt)
Procedure SetDirectoryAttributes(path.s Attribute.l)
If OpenLibrary(0,"kernel32.dll")
 CallFunction(0,"SetFileAttributesA",path.s, Attribute.l)
 CloseLibrary(0)
 ProcedureReturn Attribute.l
Else
 ProcedureReturn 0
EndProcedure
PB 4.20,Blitz3D 1.98,Microsoft Visual Studio 2005 Professional, Microsoft Visual Studio 2008 Professional
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 »

SetFileAttributes ist auch für Directories :wink:
und funktioniert auch im Unicode-Mode, der Deinem Beispiel ebenfalls fehlt.
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
Knight_Rider_2000
Beiträge: 145
Registriert: 05.02.2007 20:46
Kontaktdaten:

Beitrag von Knight_Rider_2000 »

Ich habe das hier gepostet da ich im Forum zum verstecken eines Verzeichnis keine Beispiele fand da hab ich dann in der Winapi etwas herumgesucht und gefunden
@Linux User
da diese Funktion eine Windows Library aufruft funktioniert diese Funktion nur unter Windows
PB 4.20,Blitz3D 1.98,Microsoft Visual Studio 2005 Professional, Microsoft Visual Studio 2008 Professional
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@Knight_Rider_2000
wenn du schon was für "Code, Tipps und Tricks" postest, dann sorg auch bitte dafür, dass das beispiel lauffähig ist. :freak:

- es fehlt ein komma zwischen den beiden argumenten, in zeile 17
- bei der If abfrage fehlt das dazugehörige EndIf
- du überprüfst nicht den rückgabewert bei CallFunction(), gibst aber trotzdem ein "erfolgreiches" ProcedureReturn aus, auch wenn der aufruf scheitern sollte
- du verwendest nicht #PB_Any für das öffnen der library
- dein beispiel ist nicht unicode tauglich

guckst du:

Code: Alles auswählen

Procedure SetDirectoryAttributes(DirName.s, Attributes.l)
  Protected Library, FunctionName.s, *Function, Result
  Library = OpenLibrary(#PB_Any, "kernel32.dll")
  If Library
    FunctionName = "SetFileAttributes"
    Select SizeOf(Character)
      Case 1
        FunctionName+"A"
      Case 2
        FunctionName+"W"
    EndSelect
    *Function = GetFunction(Library, FunctionName)
    If *Function And CallFunctionFast(*Function, DirName, Attributes)
      Result = Attributes
    EndIf
    CloseLibrary(Library)
  EndIf
  ProcedureReturn Result
EndProcedure
aber wie ts-soft schon sagte, kann man SetFileAttributes() auch für ordner verwenden. ist sowieso das gleiche.

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Die ganz Faulen koennen ja

Code: Alles auswählen

SetFileAttributes_(DirName.s, Attributes.l)
benutzen ;)
Antworten