天天看点

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 ……可以说非常麻烦了。。。。

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

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