Code: Alles auswählen
;basis http://www.purebasic.fr/english/viewtopic.php?f=7&t=29860&p=220852 - wenn auch ohne funktion...
;Anleitung: http://www.flexhex.com/docs/articles/hard-links.phtml
#FILE_DEVICE_FILE_SYSTEM = 9
#METHOD_BUFFERED = 0
#FILE_ANY_ACCESS = 0
#FILE_LIST_DIRECTORY = 1
#FILE_SHARE_READ = 1
#FILE_SHARE_DELETE = 4
#OPEN_EXISTING = 3
#FILE_FLAG_BACKUP_SEMANTICS = 33554432; $02000000
#FILE_SHARE_DELETE = 4
#FILE_FLAG_OPEN_REPARSE_POINT=2097152
#IO_REPARSE_TAG_MOUNT_POINT = 2684354563
#IO_REPARSE_TAG_SYMLINK = 2684354572
#GetFileExInfoStandard=0
#FILE_SPECIAL_ACCESS = (#FILE_ANY_ACCESS)
Macro CTL_CODE( DeviceType, Function, Method, Access )
(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
EndMacro
#FSCTL_SET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 41, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS)
#FSCTL_GET_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 42, #METHOD_BUFFERED, #FILE_ANY_ACCESS)
#FSCTL_DELETE_REPARSE_POINT = CTL_CODE(#FILE_DEVICE_FILE_SYSTEM, 43, #METHOD_BUFFERED, #FILE_SPECIAL_ACCESS)
;-ReparseTag values...
Structure REPARSE_MOUNTPOINT_DATA_BUFFER
ReparseTag.l
ReparseDataLength.l
Reserved.w
ReparseTargetLength.w
ReparseTargetMaximumLength.w
Reserved1.w
ReparseTarget.b[1]
EndStructure
#REPARSE_MOUNTPOINT_HEADER_SIZE=8
;-start
Procedure IsJuction(dirin.s)
attribute.WIN32_FIND_DATA
GetFileAttributesEx_(DirIn ,#GetFileExInfoStandard,@attribute)
If attribute\dwFileAttributes & #FILE_ATTRIBUTE_REPARSE_POINT
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
DirIn.s="c:\test113"
DirOut.s="\??\c:\empty\";
Procedure CreateJunction(dirin.s,dirout.s)
handle.l=CreateFile_(DirIn, #GENERIC_WRITE | #GENERIC_READ ,#FILE_SHARE_READ, #Null, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS|#FILE_FLAG_OPEN_REPARSE_POINT, #Null)
If handle <>#INVALID_HANDLE_VALUE
*buffer.REPARSE_MOUNTPOINT_DATA_BUFFER=AllocateMemory(SizeOf(REPARSE_MOUNTPOINT_DATA_BUFFER)+Len(dirout)*2+2)
*buffer\ReparseTag=#IO_REPARSE_TAG_MOUNT_POINT
PokeS(*buffer+OffsetOf(REPARSE_MOUNTPOINT_DATA_BUFFER\ReparseTarget),dirout,-1,#PB_Unicode)
*buffer\ReparseTargetMaximumLength=Len(dirout)*2+2
*buffer\ReparseTargetLength=Len(dirout)*2
*buffer\ReparseDataLength=*buffer\ReparseTargetLength+12
dummy.l=0
DeviceIoControl_(handle, #FSCTL_SET_REPARSE_POINT,*buffer,*buffer\ReparseDataLength+#REPARSE_MOUNTPOINT_HEADER_SIZE ,#Null,0,@dummy,#Null)
CloseHandle_(handle)
FreeMemory(*buffer)
EndIf
EndProcedure
Procedure DeleteJunction(dirin.s)
handle.l=CreateFile_(DirIn, #GENERIC_WRITE | #GENERIC_READ ,#FILE_SHARE_READ, #Null, #OPEN_EXISTING, #FILE_FLAG_BACKUP_SEMANTICS|#FILE_FLAG_OPEN_REPARSE_POINT, #Null)
If handle <>#INVALID_HANDLE_VALUE
*buffer.REPARSE_MOUNTPOINT_DATA_BUFFER=AllocateMemory(SizeOf(REPARSE_MOUNTPOINT_DATA_BUFFER)+2)
*buffer\ReparseTag=#IO_REPARSE_TAG_MOUNT_POINT
dummy.l=0
DeviceIoControl_(handle, #FSCTL_DELETE_REPARSE_POINT,*buffer,*buffer\ReparseDataLength+#REPARSE_MOUNTPOINT_HEADER_SIZE ,#Null,0,@dummy,#Null)
CloseHandle_(handle)
FreeMemory(*buffer)
EndIf
EndProcedure
CreateDirectory(dirin)
MessageRequester("Test",Str( IsJuction(dirin)))
createjunction(dirin,dirout)
MessageRequester("Test",Str( IsJuction(dirin)))
deletejunction(dirin)
MessageRequester("Test",Str( IsJuction(dirin)))
DeleteDirectory(dirin,"*.*")
End
Es wird ein Verzeichnis-Link "c:\test113" erstellt, das auf "c:\empty" verweist (bitte vorher erstellen und eine dummy-Datei zu Testzwecken reinkopieren).