def readlinkWindows(path):
reparse_point_handle = CreateFileW(path,
0,
0,
None,
OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT |
FILE_FLAG_BACKUP_SEMANTICS,
None)
if reparse_point_handle == INVALID_HANDLE_VALUE:
from pygcam.log import getLogger
_logger = getLogger(__name__)
_logger.info("Can't readlink: %s", path)
raise ctypes.WinError()
target_buffer = ctypes.c_buffer(MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
n_bytes_returned = DWORD()
io_result = DeviceIoControl(reparse_point_handle,
FSCTL_GET_REPARSE_POINT,
None, 0,
target_buffer, len(target_buffer),
ctypes.byref(n_bytes_returned),
None)
CloseHandle(reparse_point_handle)
if not io_result:
raise ctypes.WinError()
rdb = REPARSE_DATA_BUFFER.from_buffer(target_buffer)
if rdb.ReparseTag == IO_REPARSE_TAG_SYMLINK:
return rdb.SymbolicLinkReparseBuffer.PrintName
elif rdb.ReparseTag == IO_REPARSE_TAG_MOUNT_POINT:
return rdb.MountPointReparseBuffer.PrintName
raise ValueError("not a link")
# Replace broken functions with those defined above.
# (In python 2.7.11 os.path.islink() indeed failed to detect link made with mklink)
评论列表
文章目录