替换windows中的readlink()函数

时间:2016-09-30 06:39:13

标签: c++ linux readlink

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 

2 个答案:

答案 0 :(得分:0)

好,如注释中所述Windows本身没有readlink()链接api。也就是说,样本中给出的代码正在执行某些实际上不需要程序直接处理的事情。 Linux系统api为您处理链接。另外readlink不会将null终止,它只会返回原始数据。也就是说,QFile提供了平台无关的api来解析链接。 let p = new SimplePeer(); p.on('signal', function (data) { console.log('SIGNAL', JSON.stringify(data)) }); const turnOn = function () { p.initiator = true; }; turnOn(); 提供了一种在Windows和UNIX上都获得链接目标的方法,而您的程序无需为此而烦恼OS的特定方面。

Windows进程不能像Linux / unix系统上那样仅使用一个衬套。实际上,窗口上实际上有两种不同类型的链接。我极力建议您在尝试进行跨平台I / O时使用Qt之类的框架。 Windows与典型的linux / unix系统完全不同。一方面,Linux / unix系统必须不是POSIX系统。

答案 1 :(得分:0)

Windows没有readlink(2)等效项,但 realpath(3)等效项:GetFinalPathNameByHandleW()

另请参阅:"How do I get information about the target of a symbolic link?" by Ramond Chen

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

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”路径。