8

我需要测试文件是否是快捷方式。我仍在试图弄清楚如何设置东西,但我可能只有它的路径,我可能只有文件的实际内容(作为字节 []),或者我可能两者都有。

一些并发症包括它可能在一个 zip 文件中(在这种情况下,路径将是内部路径)

4

3 回答 3

18

可以使用 SHELL32.DLL 中的 COM 对象来操作快捷方式。

在您的 Visual Studio 项目中,添加对 COM 库“Microsoft Shell Controls And 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
    }
于 2008-11-22T00:28:47.470 回答
3

您可以简单地检查此文件的扩展名和/或内容。它在标头中包含一个特殊的 GUID。

阅读[本文档][1]。

链接已删除,对我来说它转到了一个色情网站

于 2008-11-22T00:25:37.633 回答
-1

检查扩展?(.lnk)

于 2008-11-22T00:25:46.790 回答