Bin da ja vielleicht auf dem Holzweg, habe aber mal mit den Konstanten aus
https://learn.microsoft.com/de-de/windo ... -constants
rumgespielt.
Bei den Verzeichnissen, die offenbar nur Symlinks sind und auf ein Zielverzeichnis verweisen, tauchen die Attribute
#FILE_ATTRIBUTE_REPARSE_POINT und #FILE_ATTRIBUTE_NOT_CONTENT_INDEXED auf. Hiermit ermittelt:
Code: Alles auswählen
Enumeration
#parent
#parentstatusbar
#parentmenu
#parentfont_1
#escape
#etg
EndEnumeration
;- Konstanten
#FILE_ATTRIBUTE_READONLY = $00000001 ;#PB_FileSystem_ReadOnly
#FILE_ATTRIBUTE_HIDDEN = $00000002 ;#PB_FileSystem_Hidden
#FILE_ATTRIBUTE_SYSTEM = $00000004 ;#PB_FileSystem_System
#FILE_ATTRIBUTE_DIRECTORY = $00000010
#FILE_ATTRIBUTE_ARCHIVE = $00000020 ;#PB_FileSystem_Archive
#FILE_ATTRIBUTE_DEVICE = $00000040
#FILE_ATTRIBUTE_NORMAL = $00000080 ;#PB_FileSystem_Normal
#FILE_ATTRIBUTE_TEMPORARY = $00000100
#FILE_ATTRIBUTE_SPARSE_FILE = $00000200
#FILE_ATTRIBUTE_REPARSE_POINT = $00000400
#FILE_ATTRIBUTE_COMPRESSED = $00000800 ;#PB_FileSystem_Compressed
#FILE_ATTRIBUTE_OFFLINE = $00001000
#FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = $00002000
#FILE_ATTRIBUTE_ENCRYPTED = $00004000
#FILE_ATTRIBUTE_INTEGRITY_STREAM = $00008000
#FILE_ATTRIBUTE_VIRTUAL = $00010000
#FILE_ATTRIBUTE_NO_SCRUB_DATA = $00020000
#FILE_ATTRIBUTE_EA = $00040000
#FILE_ATTRIBUTE_RECALL_ON_OPEN = $00040000 ;gleicher Wert wie #FILE_ATTRIBUTE_EA ?
#FILE_ATTRIBUTE_PINNED = $00080000
#FILE_ATTRIBUTE_UNPINNED = $00100000
#FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = $00400000
Procedure checkDirAttr(dir$)
Value = GetFileAttributes(dir$)
Debug dir$
If Value = -1
Debug "Fehler beim Lesen der Attribute!"
Else
If Value & #FILE_ATTRIBUTE_READONLY : Debug "#FILE_ATTRIBUTE_READONLY" : EndIf
If Value & #FILE_ATTRIBUTE_HIDDEN : Debug "#FILE_ATTRIBUTE_HIDDEN" : EndIf
If Value & #FILE_ATTRIBUTE_SYSTEM : Debug "#FILE_ATTRIBUTE_SYSTEM" : EndIf
If Value & #FILE_ATTRIBUTE_DIRECTORY : Debug "#FILE_ATTRIBUTE_DIRECTORY" : EndIf
If Value & #FILE_ATTRIBUTE_ARCHIVE : Debug "#FILE_ATTRIBUTE_ARCHIVE" : EndIf
If Value & #FILE_ATTRIBUTE_DEVICE : Debug "#FILE_ATTRIBUTE_DEVICE" : EndIf
If Value & #FILE_ATTRIBUTE_NORMAL : Debug "#FILE_ATTRIBUTE_NORMAL" : EndIf
If Value & #FILE_ATTRIBUTE_TEMPORARY : Debug "#FILE_ATTRIBUTE_TEMPORARY" : EndIf
If Value & #FILE_ATTRIBUTE_SPARSE_FILE : Debug "#FILE_ATTRIBUTE_SPARSE_FILE" : EndIf
If Value & #FILE_ATTRIBUTE_REPARSE_POINT : Debug "#FILE_ATTRIBUTE_REPARSE_POINT" : EndIf
If Value & #FILE_ATTRIBUTE_COMPRESSED : Debug "#FILE_ATTRIBUTE_COMPRESSED" : EndIf
If Value & #FILE_ATTRIBUTE_OFFLINE : Debug "#FILE_ATTRIBUTE_OFFLINE" : EndIf
If Value & #FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : Debug "#FILE_ATTRIBUTE_NOT_CONTENT_INDEXED" : EndIf
If Value & #FILE_ATTRIBUTE_ENCRYPTED : Debug "#FILE_ATTRIBUTE_ENCRYPTED" : EndIf
If Value & #FILE_ATTRIBUTE_INTEGRITY_STREAM : Debug "#FILE_ATTRIBUTE_INTEGRITY_STREAM" : EndIf
If Value & #FILE_ATTRIBUTE_VIRTUAL : Debug "#FILE_ATTRIBUTE_VIRTUAL" : EndIf
If Value & #FILE_ATTRIBUTE_NO_SCRUB_DATA : Debug "#FILE_ATTRIBUTE_NO_SCRUB_DATA" : EndIf
If Value & #FILE_ATTRIBUTE_EA : Debug "#FILE_ATTRIBUTE_EA" : EndIf
If Value & #FILE_ATTRIBUTE_RECALL_ON_OPEN : Debug "#FILE_ATTRIBUTE_RECALL_ON_OPEN" : EndIf
If Value & #FILE_ATTRIBUTE_PINNED : Debug "#FILE_ATTRIBUTE_PINNED" : EndIf
If Value & #FILE_ATTRIBUTE_UNPINNED : Debug "#FILE_ATTRIBUTE_UNPINNED" : EndIf
If Value & #FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS : Debug "#FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS" : EndIf
EndIf
Debug "----------------------"
Debug " "
; Werte aus: https://learn.microsoft.com/de-de/windows/win32/fileio/file-attribute-constants
EndProcedure
;GetParentWinMetrics
Global winwidth, winheight
Procedure GetParentWinMetrics()
winwidth = WindowWidth(#parent)
winheight = WindowHeight(#parent)
If IsMenu(#parentmenu) : winheight - MenuHeight() : EndIf
If IsStatusBar(#parentstatusbar) : winheight - StatusBarHeight(#parentstatusbar) : EndIf
EndProcedure
Procedure UpdateGadgets()
GetParentWinMetrics()
ResizeGadget(#etg,0,0,winwidth,winheight)
EndProcedure
Procedure UpdateWindow()
dx = WindowWidth(#parent)
dy = WindowHeight(#parent)
If dx % 2 : dx + 1 : EndIf
If dy % 2 : dy + 1 : EndIf
ResizeWindow(#parent,#PB_Ignore,#PB_Ignore,dx,dy)
UpdateGadgets()
EndProcedure
;- openwindow
#parentflags = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
OpenWindow(#parent, 0, 0, 1000, 700, "", #parentflags)
LoadFont(#parentfont_1, "Calibri", 11) : SetGadgetFont(#PB_Default, FontID(#parentfont_1))
;- Shortcuts
AddKeyboardShortcut(0, #PB_Shortcut_Escape, #escape)
;- Statusbar
If CreateStatusBar(#parentstatusbar, WindowID(#parent))
AddStatusBarField(#PB_Ignore)
EndIf
If IsMenu(#parentmenu)
WindowBounds(#parent, 220, MenuHeight(), #PB_Ignore, #PB_Ignore)
Else
WindowBounds(#parent, 220, 0, #PB_Ignore, #PB_Ignore)
EndIf
;- Programmcode -----------------------------------
;winwidth, winheight
GetParentWinMetrics()
ExplorerTreeGadget(#etg,0,0,winwidth,winheight,GetUserDirectory(#PB_Directory_Documents))
; BindEvents
BindEvent(#PB_Event_SizeWindow, @UpdateWindow(), #parent)
;- Eventschleife
Repeat
Event = WindowEvent()
Gadget = EventGadget()
Select Event
Case #PB_Event_CloseWindow
Select EventWindow()
Case #parent
Break
EndSelect
EndSelect
Select Gadget
Case #etg
Select EventType()
Case #PB_EventType_Change
checkDirAttr(GetGadgetText(Gadget))
Case #PB_EventType_LeftClick
Case #PB_EventType_LeftDoubleClick
Case #PB_EventType_RightClick
Case #PB_EventType_RightDoubleClick
EndSelect
EndSelect
ForEver
End
Meine Frage: Bin ich da komplett auf der falschen Fährte oder kann jemand bestätigen, dass mit
#FILE_ATTRIBUTE_REPARSE_POINT und / oder
#FILE_ATTRIBUTE_NOT_CONTENT_INDEXED ein Symlink sicher erkannt und eine Unterscheidung zu einem "echten " Verzeichnis sicher funktioniert? Reicht eines der beiden Attribute (welches?) oder müssen beide vorhanden sein?