How can I test programmatically if a path/file is a shortcut?

后端 未结 3 979
滥情空心
滥情空心 2021-01-02 12:23

I need to test if a file is a shortcut. I\'m still trying to figure out how stuff will be set up, but I might only have it\'s path, I might only have the actual contents of

相关标签:
3条回答
  • 2021-01-02 12:33

    You can simply check the extension and/or contents of this file. It contains a special GUID in the header.

    Read this document.

    0 讨论(0)
  • 2021-01-02 12:46

    Check the extension? (.lnk)

    0 讨论(0)
  • 2021-01-02 12:50

    Shortcuts can be manipulated using the COM objects in SHELL32.DLL.

    In your Visual Studio project, add a reference to the COM library "Microsoft Shell Controls And Automation" and then use the following:

    /// <summary>
    /// Returns whether the given path/file is a link
    /// </summary>
    /// <param name="shortcutFilename"></param>
    /// <returns></returns>
    public static bool IsLink(string shortcutFilename)
    {
        string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
        string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);
    
        Shell32.Shell shell = new Shell32.ShellClass();
        Shell32.Folder folder = shell.NameSpace(pathOnly);
        Shell32.FolderItem folderItem = folder.ParseName(filenameOnly);
        if (folderItem != null)
        {
            return folderItem.IsLink;
        }
        return false; // not found
    }
    

    You can get the actual target of the link as follows:

        /// <summary>
        /// If path/file is a link returns the full pathname of the target,
        /// Else return the original pathnameo "" if the file/path can't be found
        /// </summary>
        /// <param name="shortcutFilename"></param>
        /// <returns></returns>
        public static string GetShortcutTarget(string shortcutFilename)
        {
            string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
            string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);
    
            Shell32.Shell shell = new Shell32.ShellClass();
            Shell32.Folder folder = shell.NameSpace(pathOnly);
            Shell32.FolderItem folderItem = folder.ParseName(filenameOnly);
            if (folderItem != null)
            {
                if (folderItem.IsLink)
                {
                    Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
                    return link.Path;
                }
                return shortcutFilename;
            }
            return "";  // not found
        }
    
    0 讨论(0)
提交回复
热议问题