C#创建带中文路径的快捷方式文件

甲方爸爸要求把引用的数据(大部分是文件)放到一个文件夹下,把文件夹路径返回;考虑到服务器空间问题,选择把资源文件的快捷方式放到文件夹里。

但资源文件是中文名,在使用 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 ……可以说非常麻烦了。。。。


于是最终我们不用这种方式引用数据了。。几个小时白干。。感到了开心微笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值