3

readLink() 存在于 linux 中,并在 unistd.h 中定义,Windows 中是否有任何类似类型的函数,请提供,否则我们是否可以制作具有类似功能的函数。我想使用与 readLink() 相同的功能,请提供用户定义的函数来替换该函数,以防没有预定义的函数提供代码快照

        char buffer[2048];

        readlink("/proc/self/exe", buffer, 2048);

        std::stringstream ss;
        ss << buffer;
        std::string exeFile = ss.str();
        std::string directory;

        const size_t last_slash_idx = exeFile.rfind('/');
        if (std::string::npos != last_slash_idx)
        {
            directory = exeFile.substr(0, last_slash_idx);
        }
        return directory;
    #endif 
4

2 回答 2

0

好的,如评论中所述,Windows 没有这样的 readlink() 链接 API。也就是说,示例中给出的代码正在做一些真正不需要由程序直接处理的事情。Linux 系统 api 为您处理链接。readlink 也不会终止它只是返回原始数据。也就是说,QFile 提供了一个独立于平台的 api 来解析链接。QFile::symLinkTarget提供了一种在 windows 和 unix 上获取链接目标的方法,而您的程序不需要弄乱操作系统特定的一面。

执行此操作的 Windows 进程不像在 linux/unix 系统上那样单行。事实上,windows 上有两种不同类型的链接。我强烈建议在尝试进行跨平台 I/O 时使用 Qt 等框架。Windows 与典型的 linux/unix 系统完全不同。一方面它不是 POSIX 系统必须是 linux/unix 系统。

于 2018-09-09T20:14:39.080 回答
0

Windows 没有readlink (2)等效项,但它确实具有realpath (3)等效项:GetFinalPathNameByHandleW().

另请参阅:“如何获取有关符号链接目标的信息?” 由拉蒙德陈

伪代码如下,错误检查省略:

HANDLE hPath = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
DWORD len = GetFinalPathNameByHandleW(hPath, NULL, 0, FILE_NAME_OPENED);
WCHAR* realPathBuf = new WCHAR[len+1];
GetFinalPathNameByHandleW(hPath, realPathBuf, len, FILE_NAME_OPENED);

请注意,这realPathBuf可能是“本地 UNC”路径,以\\?\.

于 2019-10-31T13:11:05.313 回答