ファイルのアイコンを取得する場合は、ExtractAssociatedIcon関数をつかいます(Icon.ExtractAssociatedIcon メソッド (String))。しかし、ネットワークドライブに保存されているファイルのアイコンを取得しようとして、

Icon MyIcon = Icon.ExtractAssociatedIcon("\\hoge\aaa\bbb.txt");

と書いてもアイコンが取得できません。この場合はWindows APIを直接叩く必要があります。

ExtractAssociatedIconでネットワーク上のファイルのICONが取得できないに記載されていたコードをC#で書き直してみると、以下のような感じになります。

using System;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;

public class HogeClass
{

  [DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon")]
  private extern static IntPtr ExtractAssociatedIcon(
      IntPtr hInst,
      [MarshalAs(UnmanagedType.LPStr)] string lpIconPath,
      ref int lpiIcon);

  private static Image GetIcon(String FilePath)
  {
    IntPtr hInst = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
    Int32 iIcon = 0;
    IntPtr hIcon;

    hIcon = ExtractAssociatedIcon(hInst, FilePath, ref iIcon);

    return Icon.FromHandle(hIcon).ToBitmap();
  }
}

なんとなく気になったので…。行数は短いので全行をコピってみます。

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ShellAboutSample
{
  public partial class Form1 : Form
  {
    [DllImport("shell32.dll")]
    static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      ShellAbout(
        this.Handle, 
        "ああああのバージョン情報#いいいい " + Assembly.GetExecutingAssembly().GetName().Version.ToString(), 
        "うううう", 
        IntPtr.Zero);
    }
  }
}

APIのリファレンスはShellAbout functionに記載されています。szApp(第2引数)は#の記号を含めると、#の前までがタイトルバーに、#の後ろがダイアログの1行目に表示されます。

Windows10だと、ライセンスがされている個人、組織がuser name、org nameと表示されるのですが、そういう仕様みたいです。

PInvoke – ShellAbout (Shell32) – Windows 10

ただ、Windowsの標準アプリ(例えば、メモ帳)のバージョン情報では名前が表示されるので、もしかしたらWindowsの標準アプリでは呼び出している関数が違うのかもしれません。

WebClientを使うと楽にできる。

ファイルのダウンロード

WebClient wc = new WebClient();

try
{
  wc.DownloadFile("http://example.com/example.html", @"C:\tmp\example.html");
} catch (Exception ex)
{
  Debug.WriteLine(ex.Message);
}
finally
{
  wc.Dispose();
}

ファイルのアップロード

WebClient wc = new WebClient();
NetworkCredential MyCredentials = new NetworkCredential(MyUserName, MyPassword);

try {
  wc.Credentials = MyCredentials;
  wc.UploadFile(Address, UploadFile);
} catch(Exception ex)
{
  Result = ex;
}
finally{
  wc.Dispose();
}

参考リンク