كيف يمكنني اختبار برمجيا إذا كان مسار / ملف هو اختصار؟

StackOverflow https://stackoverflow.com/questions/310595

  •  10-07-2019
  •  | 
  •  

سؤال

ولست بحاجة لمعرفة ما إذا كان ملف اختصار. أنا لا تزال تحاول معرفة كيف سيتم تعيين الاشياء، لكني قد لا تملك إلا انها الطريق، وأنا قد لا تملك إلا المحتويات الفعلية للملف (كما بايت []) وإلا فإنني سأضطر على حد سواء.

وتشمل عدد قليل من مضاعفات أنني يمكن أن يكون في ملف مضغوط (في هذه الحالات الطريق سوف يكون المسار الداخلي)

هل كانت مفيدة؟

المحلول

يمكن التلاعب

واختصارات باستخدام كائنات COM في SHELL32.DLL.

في مشروع برنامج Visual Studio الخاص بك، إضافة مرجع إلى مكتبة COM "الضوابط مايكروسوفت شل وأتمتة" ثم استخدم ما يلي:

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

نصائح أخرى

ويمكنك ببساطة تحقق ملحق و / أو محتويات هذا الملف. وهو يحتوي على GUID خاص في الرأس.

هذه الوثيقة .

وتحقق التمديد؟ (.lnk)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top