Eigene Funktionen zu ..\Include per Hardlink

    • 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
    [autoit]

    ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]


    Der eigentliche Code (Pfad-/Dateiauswahl, Link anlegen) sind nur 3 Zeilen. Der Rest ist Error Handling. :D