duschgas
Goto Top

VB.NET Symlink (mklink)

Guten Tag,

ich bin am verzweifeln.
Mittels VB.NET möchte ich per Buttonklick einen Symlink (mklink) einer Datei erstellen.

Mein code sieht wie folgt aus.
        Dim rnd As New Random
        Dim ZufallsZahl As Integer = rnd.Next(1, 10000000)

        Dim appData As String = GetFolderPath(SpecialFolder.ApplicationData)

        Dim MkLink1 As String = "C:\Program Files (x86)\Testpfad\" & ZufallsZahl & "\Test.txt"  
        Dim Mklink2 As String = "" & appData & "\Testpfad\Test.txt"  

        Dim Mklink As New Process
            Mklink.StartInfo.FileName = "cmd.exe"  
            Mklink.StartInfo.Arguments = "/C mklink " & Chr(34) & MkLink1 & Chr(34) & " " & Chr(34) & Mklink2 & Chr(34)  
            Mklink.Start()

Beide Pfade enthalten Leerzeichen. Mit dem Wert "Zufallszahl" wird davor eine Zufallszahl generiert. Das funktioniert tatellos.

Kann mir jemand weiterhelfen? Ich komme einfach nicht zurecht.

Vielen lieben Dank.
Paddy

Content-Key: 297092

Url: https://administrator.de/contentid/297092

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: 126919
Lösung 126919 23.02.2016 aktualisiert um 12:58:48 Uhr
Goto Top
Mach das Erstellen eines Softlinks nativ mit der WIn32-API (CreateSymbolicLink) und nicht so umständlich über die CMD X) wir sind hier ja nicht auf einer DOS-Party face-wink
Imports System.Runtime.InteropServices

Public Class Form1
    Private Enum SYMBOLIC_LINK_FLAG As Integer
        File = 0
        Directory = 1
    End Enum

    <DllImport("kernel32.dll")>  
    Private Shared Function CreateSymbolicLink(ByVal lpSymlinkFileName As String, ByVal lpTargetFileName As String, ByVal dwFlags As SYMBOLIC_LINK_FLAG) As Boolean
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        CreateSymbolicLink("C:\test_link.txt", "C:\test.txt", SYMBOLIC_LINK_FLAG.File)  
    End Sub

End Class
Der letzte Parameter bei CreateSymbolic Link sagt aus ob der Link ein Verzeichnis oder eine Datei ist welche verlinkt wird.

fk
Mitglied: duschgas
duschgas 23.02.2016 aktualisiert um 12:53:51 Uhr
Goto Top
Hallo,

vielen Dank. Das funktioniert 1a mit
CreateSymbolicLink("C:\test_link.txt", "C:\test.txt", SYMBOLIC_LINK_FLAG.File)

Leider habe ich immernoch Probleme mit den Leerzeichen

Dim MkLink1 As String = "C:\Program Files (x86)\Testpfad\" & ZufallsZahl & "\Test.txt"
Dim Mklink2 As String = "" & appData & "\Testpfad\Test.txt"

CreateSymbolicLink(MkLink1, Mklink2 , SYMBOLIC_LINK_FLAG.File)

Hättets du da einen Tipp für mich?
Mitglied: 126919
126919 23.02.2016 aktualisiert um 12:58:58 Uhr
Goto Top
Zitat von @duschgas:
Leider habe ich immernoch Probleme mit den Leerzeichen

Dim MkLink1 As String = "C:\Program Files (x86)\Testpfad\" & ZufallsZahl & "\Test.txt"
Dim Mklink2 As String = "" & appData & "\Testpfad\Test.txt"

CreateSymbolicLink(MkLink1, Mklink2 , SYMBOLIC_LINK_FLAG.File)

Hättets du da einen Tipp für mich?
Geht hier auch mit Pfaden die Leerzeichen enthalten einwandfrei! Ein zusätzliches HInzufügen von Anführungszeichen ist nicht erforderlich. Du musst hier aber wissen das du nur als Administrator in das ProgramFiles Verzeichnisse schreiben kannst! Diese Verzeichnisse sind besonders geschützt.
Mitglied: duschgas
duschgas 23.02.2016 um 12:59:02 Uhr
Goto Top
Danke, es hat doch funktioniert, es war mein Fehler
Mitglied: 126919
126919 23.02.2016 aktualisiert um 13:02:27 Uhr
Goto Top
Noch als Zusatz: Wenn du Hardlinks erstellen willst geht das auch

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>  
Private Shared Function CreateHardLink(ByVal lpFileName As String, ByVal lpExistingFileName As String, ByVal lpSecurityAttributes As IntPtr) As Boolean
End Function
Mitglied: duschgas
duschgas 23.02.2016 um 18:12:08 Uhr
Goto Top
Vielen Dank, du bist die Rettung face-smile