如果目标目录不存在,如何获取Junction的目标位置



我有一个来自A->CCD_ 2。B不存在,但我想从A读取结的目标(B(。

然而,我无法实现这一点(文件名=A(:

// directoryHandle.isInvalid == true
var directoryHandle = CreateFile(filename, EFileAccess.GenericRead, EFileShare.Read | EFileShare.Write, IntPtr.Zero, ECreationDisposition.OpenExisting, EFileAttributes.BackupSemantics, IntPtr.Zero);
StringBuilder path = new StringBuilder(1024);
// path is empty string
var res = GetFinalPathNameByHandle(directoryHandle, path, path.Capacity, 0);

如果B存在,GetFinalPathNameByHandle返回结点的位置。但如果B不存在,我会收到一个无效的文件句柄,因此对GetFinalPathNameByHandle的调用也会失败。

问题:如果目标目录不存在,如何获取连接的目标?


以下是方法定义:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern SafeFileHandle CreateFile(
string lpFileName,
EFileAccess dwDesiredAccess,
EFileShare dwShareMode,
IntPtr lpSecurityAttributes,
ECreationDisposition dwCreationDisposition,
EFileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32.dll", EntryPoint = "GetFinalPathNameByHandleW", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern int GetFinalPathNameByHandle([In] SafeFileHandle hFile, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder path, int bufLen, int flags);

直接询问路口。

要确定类型,请使用FindFirstFile(如果已经有句柄,则使用GetFileInformationByHandleEx(FileAttributeTagInfo)(。必须在文件属性中设置FILE_ATTRIBUTE_REPARSE_POINT位,并且标记必须是IO_REPARSE_TAG_MOUNT_POINTIO_REPARSE_TAG_SYMLINK

如果所有检查都通过,请使用FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS标志调用CreateFile。现在调用DeviceIoControl(FSCTL_GET_REPARSE_POINT)读取REPARSE_DATA_BUFFER(为其分配MAXIMUM_REPARSE_DATA_BUFFER_SIZE字节(。查看标签类型以查找PathBufferSubstituteNameOffset+B0以查找路径在缓冲区中的位置。

你可以在Codeproject上找到C#示例代码。。。

最新更新