- Offizieller Beitrag
Hi,
wenn ihr UDF's nutzt und ihr möchtet sie im Include-Verzeichnis zur Verfügung haben, hat dies den Nachteil, dass bei Installation einer neuen Version von AutoIt auch der Include-Ordner überschrieben wird und somit eure Kopie futsch ist.
Außerdem sind bei einer kopierten Datei Änderungen im Original nicht in der Kopie sichtbar. Ihr müßtet also dann in der Kopie auch ändern.
Tipp:
Einen Hardlink zur UDF ins Include-Verzeichnis erstellen.
Ein Hardlink ist ein weiterer Verweis auf ein und dieselbe physikalische Datei.
Es wird also nur einmal Speicher verwendet, die Datei kann unter Original- und Linknamen angesprochen und verändert werden.
Was ist zu beachten?
- funktioniert nur bei NTFS-Dateisystem
- man sollte (mit Nicht-Microsoft-Programmen) nur das Original bearbeiten - warum? - einige Programme löschen vor dem Speichervorgang die Ausgangsdatei und erstellen sie dann neu. Passiert das mit der Link-Datei, wird der Hardlink aufgehoben und die Datei als eigenständige Datei erstellt.
- bei Verlinkung von Dateien müssen Quelle und Ziel auf einem Volume sein (nur Verlinkung von Ordnern erlaubt Crossover)
- zum Setzen des Links sind Adminrechte notwendig
Hier mein Skript dafür (Auswahl der Datei mit FileOpenDialog), Voraussetzung AutoIt in Standardinstallation (sonst Pfad anpassen):
Spoiler anzeigen
; Adminrechte ?
If ( Not IsAdmin() ) Then
MsgBox(262160, '', 'Zum Ausführen des Programms sind Administratorrechte erforderlich!')
Exit
EndIf
; Dateisystem ist NTFS ?
Dim $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20, $colItems = "", $strComputer = "localhost"
Dim $Output="", $Out2 = ''
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If $objItem.Description = 'Lokale Festplatte' Then
If $objItem.FileSystem <> 'NTFS' Then
$Output = $Output & "DeviceID: " & $objItem.DeviceID & @CRLF
$Output = $Output & "FileSystem: " & $objItem.FileSystem & @CRLF & @CRLF
EndIf
EndIf
Next
If $Output <> "" Then
If MsgBox(262436, 'Dateisystem falsch', 'Folgende Festplatte(n) sind nicht im "NTFS-Format"' & @LF & _
'und somit kann kein Hardlink auf ihnen erzeugt werden:' & @LF & @LF & $Output & @LF & @LF & _
'Wenn die für den Hardlink gewünschte Festplatte nicht aufgezählt wurde,' & @LF & _
'können Sie fortsetzen.' & @LF & _
'Möchten Sie fortsetzen?') = 7 Then Exit
EndIf
Else
Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_LogicalDisk" )
Exit
Endif
; Daten für Hardlink
Dim $Include = RegRead("HKLM\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Include\"
Dim $Source, $ret
Do
$Source = FileOpenDialog("Datei für Hard-Link", @ScriptDir, "AutoIt Dateien (*.au3)")
If $Source = '' Then _
$ret = MsgBox(262436, 'Auswahlfehler', 'Es wurde keine Datei ausgewählt!' & @LF & _
'Möchten Sie erneut wählen?')
Until $ret = 7 Or $Source <> ''
If $Source = '' Then Exit
Dim $File = StringRight($Source, StringLen($Source)-StringInStr($Source, '\', 1, -1))
If @error Then
MsgBox(0, '', $Source & @LF & 'enthält keinen gültigen Pfad/Dateinamen!')
Exit
EndIf
; Hardlink erstellen
If FileCreateNTFSLink($Source, $Include & $File) = 1 Then
MsgBox(262208, '', 'Der Hardlink' & @LF & @LF & $Include & $File & @LF & @LF & 'wurde erfolgreich angelegt.')
Else
MsgBox(262160, '', 'Der Hardlink' & @LF & @LF & $Include & $File & @LF & @LF & 'konnte nicht angelegt werden.')
EndIf
Der eigentliche Code (Pfad-/Dateiauswahl, Link anlegen) sind nur 3 Zeilen. Der Rest ist Error Handling.