首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用.Net获取符号链接(或分析点)的目标?

如何使用.Net获取符号链接(或分析点)的目标?
EN

Stack Overflow用户
提问于 2010-02-20 13:59:41
回答 4查看 14.7K关注 0票数 17

在.NET中,我认为可以通过调用System.IO.File.GetAttributes()和检查ReparsePoint位来确定文件是否是符号链接。就像这样:

代码语言:javascript
复制
var a = System.IO.File.GetAttributes(fileName);
if ((a & FileAttributes.ReparsePoint) != 0)
{
    // it's a symlink
}

在这种情况下,如何获得符号链接的目标?

ps:我知道如何创建一个符号链接。它需要P/Invoke:

代码语言:javascript
复制
[Interop.DllImport("kernel32.dll", EntryPoint="CreateSymbolicLinkW", CharSet=Interop.CharSet.Unicode)] 
public static extern int CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-20 14:27:12

您必须使用DeviceIoControl()并发送FSCTL_GET_REPARSE_POINT控制代码。P/Invoke和API的使用细节相当具体,但它是谷歌真的很好的。

票数 10
EN

Stack Overflow用户

发布于 2015-11-02 21:41:38

基于提到的GetFinalPathNameByHandle的答案,这里是执行此操作的C#代码(因为所有其他答案都只是指针):

用法

代码语言:javascript
复制
var path = NativeMethods.GetFinalPathName(@"c:\link");

代码:

代码语言:javascript
复制
public static class NativeMethods
{
    private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);

    private const uint FILE_READ_EA = 0x0008;
    private const uint FILE_FLAG_BACKUP_SEMANTICS = 0x2000000;

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint GetFinalPathNameByHandle(IntPtr hFile, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpszFilePath, uint cchFilePath, uint dwFlags);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool CloseHandle(IntPtr hObject);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CreateFile(
            [MarshalAs(UnmanagedType.LPTStr)] string filename,
            [MarshalAs(UnmanagedType.U4)] uint access,
            [MarshalAs(UnmanagedType.U4)] FileShare share,
            IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
            [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
            [MarshalAs(UnmanagedType.U4)] uint flagsAndAttributes,
            IntPtr templateFile);

    public static string GetFinalPathName(string path)
    {
        var h = CreateFile(path, 
            FILE_READ_EA, 
            FileShare.ReadWrite | FileShare.Delete, 
            IntPtr.Zero, 
            FileMode.Open, 
            FILE_FLAG_BACKUP_SEMANTICS,
            IntPtr.Zero);
        if (h == INVALID_HANDLE_VALUE)
            throw new Win32Exception();

        try
        {
            var sb = new StringBuilder(1024);
            var res = GetFinalPathNameByHandle(h, sb, 1024, 0);
            if (res == 0)
                throw new Win32Exception();

            return sb.ToString();
        }
        finally
        {
            CloseHandle(h);
        }
    }
}
票数 16
EN

Stack Overflow用户

发布于 2022-01-18 21:03:53

在.NET 6中,您可以使用属性LinkTarget

代码语言:javascript
复制
bool IsLink(string path)
{
    var fi = new FileInfo(path);
    return fi.LinkTarget != null
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2302416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档