Как я могу программно проверить, если путь / файл является ярлыком? - PullRequest
6 голосов
/ 22 ноября 2008

Мне нужно проверить, является ли файл ярлыком. Я все еще пытаюсь выяснить, как будет настроен материал, но у меня может быть только его путь, у меня может быть только фактическое содержимое файла (в виде байта []), или у меня может быть и то и другое.

Несколько сложностей включают в себя то, что я могу быть в zip-файле (в этом случае путь будет внутренним путем)

Ответы [ 3 ]

14 голосов
/ 22 ноября 2008

С ярлыками можно манипулировать, используя COM-объекты в SHELL32.DLL.

В своем проекте Visual Studio добавьте ссылку на библиотеку COM «Элементы управления Microsoft Automation» и затем используйте следующее:

/// <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
}

Фактическую цель ссылки можно получить следующим образом:

    /// <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
    }
3 голосов
/ 22 ноября 2008

Вы можете просто проверить расширение и / или содержимое этого файла. Он содержит специальный GUID в заголовке.

Читать этот документ .

0 голосов
/ 22 ноября 2008

Проверить расширение? (.Lnk)

...