33351


C#にて、ショートカットファイルの作成を行うプログラムを作成しているのですが  
とあるネットワークドライブ上のフォルダをショートカットとして作成すると

C#のアプリ側からそのネットワークドライブが見えない場合に  
ファイルとしてのショートカットが作成されてしまいます。(開くプログラムを選択するダイアログが表示される)

見えないネットワークドライブ上のフォルダへのショートカットを  
フォルダとして作成する方法はないでしょうか？

ショートカットは以下のコードで作成しております。

[code]

    var shortcutFile = filePath + ".lnk";
    dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("WScript.Shell"));
    
    var shortcut = shell.CreateShortcut(shortcutFile);
    shortcut.TargetPath = networkPath;
    shortcut.Save();
    
[/code]


CC BY-SA 3.0
2017-03-16T00:29:19.770
33348
2017-03-16T11:58:52.297
20906
question
c# windows
C# 見えないネットワーク上フォルダへのショートカット作成


正常な.lnkファイルは内部に対象のUNCパスやNetBIOS名を保持しています。この値は`WshShortcut`では指定できませんので、リンク先が参照できる状態で`CreateShortcut`メソッドを呼び出すのが前提になっていると思います。

しかし原理的には公開されている[.lnkファイルのフォーマット](https://msdn.microsoft.com/en-
us/library/dd871305.aspx)に従ってバイナリを出力すればネットワークドライブ接続時と同等のリンクを作成することも可能だとは思います。


CC BY-SA 3.0
2017-03-16T01:20:19.637
33349
2017-03-16T01:20:19.637
5750
33348
answer


`IconLocation`を設定すれば、無理やりフォルダアイコンを埋め込むこと自体は可能です。

[code]

    shortcut.IconLocation = @"%SystemRoot%\system32\SHELL32.dll, 3"; //フォルダアイコン
    
[/code]

ただし決め打ちでフォルダアイコンを設定しているため、常に空のフォルダアイコンが表示されます。  
※Windows10のエクスプローラなどで特大アイコン表示に切り替えると、通常のフォルダショートカットはフォルダアイコンが空であったりファイルのサムネールが表示されたりと、中に入っているファイルに合わせて表示が変わります。

ちなみに私の環境では、存在しないネットワークドライブ上のフォルダへのショートカットを作った後にネットワークドライブを作成すると、開くプログラムを選択するダイアログが表示されてしまって動作させることができませんでした。

下記のように`explorer`の引数としてコーディングすれば、フォルダが存在する時に開くことはできますが、今度はアイコンがエクスプローラのものになります。  
他の回答にあるように、リンク先が参照できる状態で`CreateShortcut`メソッドを呼び出すべきと思われます。

[code]

    var shortcutFile = filePath + ".lnk";
    dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("WScript.Shell"));
    var shortcut = shell.CreateShortcut(shortcutFile);
    shortcut.TargetPath = "explorer.exe";
    shortcut.Arguments = networkPath;
    shortcut.WorkingDirectory = System.IO.Path.GetDirectoryName(networkPath);
    shortcut.Save();
    
[/code]


CC BY-SA 3.0
2017-03-16T03:01:59.113
33351
2017-03-16T11:58:52.297
2017-03-16T11:58:52.297
9820
9820
33348
answer