Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c#

shortcut

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 the file (as a byte[]) or I might have both.

A few complications include that I it could be in a zip file (in this cases the path will be an internal path)

like image 721
BCS Avatar asked Nov 22 '08 00:11

BCS


2 Answers

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
    }
like image 169
Mitch Wheat Avatar answered Nov 15 '22 19:11

Mitch Wheat


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

Read [this document][1].

Link deleted, for me it goes to a porn site

like image 38
user38123 Avatar answered Nov 15 '22 20:11

user38123