甲方爸爸要求把引用的数据(大部分是文件)放到一个文件夹下,把文件夹路径返回;考虑到服务器空间问题,选择把资源文件的快捷方式放到文件夹里。
但资源文件是中文名,在使用 IWshShortcut 的时候总是出错,耗时快两个点才定位出来居然是中文的问题//还以为2018了大部分库也应该能支持中文了然而图拿衣服啊
最终解决方案
添加引用->COM->Microsoft Shell Controls And Automation
/// <summary>
/// 为文件创建快捷方式
/// </summary>
/// <param name="fileName">源文件路径</param>
/// <param name="Folder">目标文件夹</param>
public static void CreateShortcut(string fileName, string Folder)
{
try
{
object[] para = new object[] { fileName, Folder };
if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
{
createShortcutWithShell(para);
}
else {
Thread staThream = new Thread(new ParameterizedThreadStart(createShortcutWithShell));
staThream.SetApartmentState(ApartmentState.STA);
staThream.Start(para);
staThream.Join();
}
}
catch (Exception e)
{
throw;
}
}
static void createShortcutWithShell(object param) {
object[] args = (object[])param;
string fileName = (string)args[0];
string Folder = (string)args[1];
if (!File.Exists(fileName)) { throw new Exception("资源文件<" + GetFileShortName(fileName) + ">不存在!"); }
InitLocalPath(Folder);
var lnkPath = Path.Combine(Folder, GetFileShortName(fileName) + ".lnk");
// Create empty .lnk file
System.IO.File.WriteAllBytes(lnkPath, new byte[0]);
// Create a ShellLinkObject that references the .lnk file
Shell32.Shell shl = new Shell32.Shell();
Shell32.Folder dir = shl.NameSpace(Folder);
Shell32.FolderItem itm = dir.Items().Item(GetFileShortName(fileName) + ".lnk");
Shell32.ShellLinkObject lnk = (Shell32.ShellLinkObject)itm.GetLink;
// Set the .lnk file properties
lnk.Path = fileName;
lnk.Save(lnkPath);
}
参考资料:
https://stackoverflow.com/questions/31403956/exception-when-using-shell32-to-get-file-extended-properties
https://stackoverflow.com/questions/13542005/create-shortcut-with-unicode-character?lq=1
下面简单说明一下:
1. IWshShortcut 对Unicode character并不支持,体现在源文件不能带有中文,且创建的.lnk文件也不能带有中文。
说到这也不知道为啥国内的资料都是用的这个库来创建快捷方式。。。
2. Shell21.Shell new的时候也会报“Unable to cast COM object of type 'Shell32.ShellClass' to interface type 'Shell32.IShellDispatch6'. ”的错,必须用STA来跑shell。
3. 当然,至此,创建中文lnk文件的问题是解决了。。。但通过中文lnk文件获取目标文件也不能用 IWshShortcut ……可以说非常麻烦了。。。。
于是最终我们不用这种方式引用数据了。。几个小时白干。。感到了开心
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5SZslWbz9CX0xWdhZWZk9CX09Wbl9lcvRXakVGa49CXy9GdpRWZoh3LcRXZu5ibkN3Yuc2bsJWLjlGdhR3cvw1LcpDc0RHaiojIsJye.gif)