Dateiverknüpfungen erstellen

Beschreibung
Bisher gibt es im Framework keine einfache Möglichkeit eine Dateiverknüpfung zu erstellen. Eine solche Möglichkeit liese sich über eine Com-Schnittstelle bewerkstelligen. Genau diese Möglichkeit möchten wir hier vorstellen.
Dazu werden wir mit der Shell32.dll kommunizieren müssen. Wir fügen unserem Projekt einen neuen Verweis hinzu. Über die Projekteigenschaften können wir bei Verweise Com-Verweise einbinden. Wir brauchen hierfür Microsoft Shell Controls And Automation. Nachfolgend kann diese Klasse verwendet werden:
VBC#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
''' <summary>
''' Stellt Informationen und Methoden für die Erstellung einer Dateiverknüpfung zur Verfügung.
''' </summary>
''' <remarks></remarks>
Public Class ShortcutFile
 
#Region " Deklarationen - Felder "
 
   Private pLinkFileInfo As System.IO.FileInfo
   Private pShortcutFileInfo As System.IO.FileInfo
   Private pWorkingDirectory As System.IO.DirectoryInfo
 
   Private pArguments As String
   Private pDescription As String
   Private pShowCommand As FormWindowState
 
#End Region
 
#Region " Konstruktoren "
 
   ''' <summary>
   ''' Initialisiert eine neue Instanz der ShortcutFile-Klasse mit den angegebenen Informationen.
   ''' </summary>
   ''' <param name="fileName">Der vollständige Name der Verknüpfung.</param>
   ''' <param name="linkFile">Der vollständige Name der zu verknüpfenden Datei.</param>
   ''' <remarks></remarks>
   Public Sub New(ByVal fileName As String, ByVal linkFile As String)
      ' Prüfe, ob die Dateierweiterung keine gültige Verknüpfung darstellt
      If IO.Path.GetExtension(fileName) <> ".lnk" Then
         ' true -> Entsprechende Dateierweiterung hinzufügen
         fileName = fileName & ".lnk"
      End If
 
      ' FileInfo und DirectoryInfo aus den vollständigen Namen erstellen
      pLinkFileInfo = New System.IO.FileInfo(linkFile)
      pShortcutFileInfo = New System.IO.FileInfo(fileName)
      pWorkingDirectory = pShortcutFileInfo.Directory
 
      Me.ShowCommand = FormWindowState.Normal
   End Sub
 
#End Region
 
#Region " Eigenschaften "
 
   ''' <summary>
   ''' Ruft die Argumente für die Verknüpfung ab oder legt diese fest.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Die Argumente für die Verknüpfung.</returns>
   ''' <remarks></remarks>
   Public Property Arguments() As String
      Get
         Return pArguments
      End Get
      Set(ByVal value As String)
         pArguments = value
      End Set
   End Property
 
   ''' <summary>
   ''' Ruft die Beschreibung für die Verknüpfung ab oder legt diese fest.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Die Beschreibung für die Verknüpfung.</returns>
   ''' <remarks></remarks>
   Public Property Description() As String
      Get
         Return pDescription
      End Get
      Set(ByVal value As String)
         pDescription = value
      End Set
   End Property
 
   ''' <summary>
   ''' Ruft den vollständigen Name der Verknüpfung ab.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Die Argumente für die Verknüpfung.</returns>
   ''' <remarks></remarks>
   Public ReadOnly Property FullName() As String
      Get
         Return pShortcutFileInfo.FullName
      End Get
   End Property
 
   ''' <summary>
   ''' Ruft den vollständigen Name der zu verknüpfenden Datei ab oder legt diesen fest.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Der vollständige Name der zu verknüpfenden Datei.</returns>
   ''' <remarks></remarks>
   Public Property LinkFile() As String
      Get
         Return pLinkFileInfo.FullName
      End Get
      Set(ByVal value As String)
         pLinkFileInfo = New System.IO.FileInfo(value)
      End Set
   End Property
 
   ''' <summary>
   ''' Gibt den Anzeigezustand der verknüpften Datei an oder legt diesen fest.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Der Anzeigezustand der verknüpften Datei.</returns>
   ''' <remarks></remarks>
   Public Property ShowCommand() As FormWindowState
      Get
         Return pShowCommand
      End Get
      Set(ByVal value As FormWindowState)
         pShowCommand = value
      End Set
   End Property
 
   ''' <summary>
   ''' Ruft den vollständigen Name des Arbeitsverzeichnisses ab oder legt diesen fest.
   ''' </summary>
   ''' <value></value>
   ''' <returns>Der vollständige Name des Arbeitsverzeichnisses.</returns>
   ''' <remarks></remarks>
   Public Property WorkingDirectory() As String
      Get
         Return pWorkingDirectory.FullName
      End Get
      Set(ByVal value As String)
         pWorkingDirectory = New System.IO.DirectoryInfo(value)
      End Set
   End Property
 
#End Region
 
#Region " Methoden - Function "
 
   ''' <summary>
   ''' Gibt das System.IO.FileInfo-Objekt für die Verknüpfung zurück.
   ''' </summary>
   ''' <returns>Das System.IO.FileInfo-Objekt der Verknüpfung.</returns>
   ''' <remarks></remarks>
   Public Function GetFileInfo() As System.IO.FileInfo
      Return pShortcutFileInfo
   End Function
 
   ''' <summary>
   ''' Gibt den Integerwert für den Anzeigezustand zurück.
   ''' </summary>
   ''' <returns>Der Integerwert für den Anzeigezustand.</returns>
   ''' <remarks></remarks>
   Private Function GetShowCommand() As Integer
      Select Case Me.ShowCommand
         Case FormWindowState.Normal
            Return 1
 
         Case FormWindowState.Minimized
            Return 7
 
         Case FormWindowState.Maximized
            Return 3
 
         Case Else
            Return 1
 
      End Select
   End Function
 
#End Region
 
#Region " Methoden - Sub "
 
   ''' <summary>
   ''' Erstellt die Verknüpfung auf dem Dateisystem.
   ''' </summary>
   ''' <remarks></remarks>
   Public Sub Create()
      ' Erstellt die Verknüpfung und schließt den Stream
      Me.GetFileInfo.Create.Close()
 
      ' Shell-Objekte deklarieren
      Dim sShell As New Shell32.Shell
      Dim sDirectory As Shell32.Folder
      Dim sFileInfo As Shell32.FolderItem
      Dim sLinkFile As Shell32.ShellLinkObject
 
      ' Verzeichnis der Verknüpfung als Shell-Objekt erzeugen
      sDirectory = sShell.NameSpace(Me.GetFileInfo.DirectoryName)
 
      ' Dateiname der Verknüpfung als Shell-Objekt erzeugen
      sFileInfo = sDirectory.Items.Item(Me.GetFileInfo.Name)
 
      ' Dateiname der zu verlinkenden Datei als Shell-Objekt erzeugen
      sLinkFile = CType(sFileInfo.GetLink, Shell32.ShellLinkObject)
 
      With sLinkFile
         ' Informationen zur Verknüpfung hinzufügen
         .Arguments = Me.Arguments
         .Description = Me.Description
         .Path = Me.LinkFile
         .ShowCommand = Me.GetShowCommand
         .WorkingDirectory = Me.WorkingDirectory
 
         ' Verknüpfung speichern
         .Save()
      End With
 
      ' Objekte zerstören
      sLinkFile = Nothing
      sFileInfo = Nothing
      sDirectory = Nothing
      sShell = Nothing
   End Sub
 
#End Region
 
End Class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
/// <summary>
/// Stellt Informationen und Methoden für die Erstellung einer Dateiverknüpfung zur Verfügung.
/// </summary>
/// <remarks></remarks>
public class ShortcutFile
{
 
    #region " Deklarationen - Felder "
 
    private System.IO.FileInfo pLinkFileInfo;
    private System.IO.FileInfo pShortcutFileInfo;
    private System.IO.DirectoryInfo pWorkingDirectory;
 
    private string pArguments;
    private string pDescription;
    private FormWindowState pShowCommand;
 
    #endregion
 
    #region " Konstruktoren "
 
    /// <summary>
    /// Initialisiert eine neue Instanz der ShortcutFile-Klasse mit den angegebenen Informationen.
    /// </summary>
    /// <param name="fileName">Der vollständige Name der Verknüpfung.</param>
    /// <param name="linkFile">Der vollständige Name der zu verknüpfenden Datei.</param>
    /// <remarks></remarks>
    public ShortcutFile(string fileName, string linkFile)
    {
        // Prüfe, ob die Dateierweiterung keine gültige Verknüpfung darstellt
        if (System.IO.Path.GetExtension(fileName) != ".lnk")
        {
            // true -> Entsprechende Dateierweiterung hinzufügen
            fileName = fileName + ".lnk";
        }
 
        // FileInfo und DirectoryInfo aus den vollständigen Namen erstellen
        pLinkFileInfo = new System.IO.FileInfo(linkFile);
        pShortcutFileInfo = new System.IO.FileInfo(fileName);
        pWorkingDirectory = pShortcutFileInfo.Directory;
 
        this.ShowCommand = FormWindowState.Normal;
    }
 
    #endregion
 
    #region " Eigenschaften "
 
    /// <summary>
    /// Ruft die Argumente für die Verknüpfung ab oder legt diese fest.
    /// </summary>
    /// <value></value>
    /// <returns>Die Argumente für die Verknüpfung.</returns>
    /// <remarks></remarks>
    public string Arguments
    {
        get { return pArguments; }
        set { pArguments = value; }
    }
 
    /// <summary>
    /// Ruft die Beschreibung für die Verknüpfung ab oder legt diese fest.
    /// </summary>
    /// <value></value>
    /// <returns>Die Beschreibung für die Verknüpfung.</returns>
    /// <remarks></remarks>
    public string Description
    {
        get { return pDescription; }
        set { pDescription = value; }
    }
 
    /// <summary>
    /// Ruft den vollständigen Name der Verknüpfung ab.
    /// </summary>
    /// <value></value>
    /// <returns>Die Argumente für die Verknüpfung.</returns>
    /// <remarks></remarks>
    public string FullName
    {
        get { return pShortcutFileInfo.FullName; }
    }
 
    /// <summary>
    /// Ruft den vollständigen Name der zu verknüpfenden Datei ab oder legt diesen fest.
    /// </summary>
    /// <value></value>
    /// <returns>Der vollständige Name der zu verknüpfenden Datei.</returns>
    /// <remarks></remarks>
    public string LinkFile
    {
        get { return pLinkFileInfo.FullName; }
        set { pLinkFileInfo = new System.IO.FileInfo(value); }
    }
 
    /// <summary>
    /// Gibt den Anzeigezustand der verknüpften Datei an oder legt diesen fest.
    /// </summary>
    /// <value></value>
    /// <returns>Der Anzeigezustand der verknüpften Datei.</returns>
    /// <remarks></remarks>
    public FormWindowState ShowCommand
    {
        get { return pShowCommand; }
        set { pShowCommand = value; }
    }
 
    /// <summary>
    /// Ruft den vollständigen Name des Arbeitsverzeichnisses ab oder legt diesen fest.
    /// </summary>
    /// <value></value>
    /// <returns>Der vollständige Name des Arbeitsverzeichnisses.</returns>
    /// <remarks></remarks>
    public string WorkingDirectory
    {
        get { return pWorkingDirectory.FullName; }
        set { pWorkingDirectory = new System.IO.DirectoryInfo(value); }
    }
 
    #endregion
 
    #region " Methoden - Function "
 
    /// <summary>
    /// Gibt das System.IO.FileInfo-Objekt für die Verknüpfung zurück.
    /// </summary>
    /// <returns>Das System.IO.FileInfo-Objekt der Verknüpfung.</returns>
    /// <remarks></remarks>
    public System.IO.FileInfo GetFileInfo()
    {
        return pShortcutFileInfo;
    }
 
    /// <summary>
    /// Gibt den Integerwert für den Anzeigezustand zurück.
    /// </summary>
    /// <returns>Der Integerwert für den Anzeigezustand.</returns>
    /// <remarks></remarks>
    private int GetShowCommand()
    {
        switch (this.ShowCommand)
        {
            case FormWindowState.Normal:
                return 1;
 
            case FormWindowState.Minimized:
                return 7;
 
            case FormWindowState.Maximized:
                return 3;
 
            default:
                return 1;
        }
    }
 
    #endregion
 
    #region " Methoden - Sub "
 
    /// <summary>
    /// Erstellt die Verknüpfung auf dem Dateisystem.
    /// </summary>
    /// <remarks></remarks>
    public void Create()
    {
        // Erstellt die Verknüpfung und schließt den Stream
        this.GetFileInfo().Create().Close();
 
        // Shell-Objekte deklarieren
        Shell32.Shell sShell = new Shell32.Shell();
        Shell32.Folder sDirectory;
        Shell32.FolderItem sFileInfo;
        Shell32.ShellLinkObject sLinkFile);
 
        // Verzeichnis der Verknüpfung als Shell-Objekt erzeugen
        sDirectory = sShell.NameSpace(this.GetFileInfo().DirectoryName);
 
        // Dateiname der Verknüpfung als Shell-Objekt erzeugen
        sFileInfo = sDirectory.Items().Item(this.GetFileInfo().Name);
 
        // Dateiname der zu verlinkenden Datei als Shell-Objekt erzeugen
        sLinkFile = (Shell32.ShellLinkObject)sFileInfo.GetLink;
 
        // Informationen zur Verknüpfung hinzufügen
        sLinkFile.Arguments = this.Arguments;
        sLinkFile.Description = this.Description;
        sLinkFile.Path = this.LinkFile;
        sLinkFile.ShowCommand = this.GetShowCommand();
        sLinkFile.WorkingDirectory = this.WorkingDirectory;
 
        // Verknüpfung speichern
        sLinkFile.Save();
 
        // Objekte zerstören
        sLinkFile = null;
        sFileInfo = null;
        sDirectory = null;
        sShell = null;
    }
 
    #endregion
 
}