首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换windows中的readlink()函数

替换windows中的readlink()函数
EN

Stack Overflow用户
提问于 2016-09-30 06:39:12
回答 3查看 2.5K关注 0票数 3

readLink()存在于linux中,定义为unistd.h,windows中是否有类似类型的函数请提供,或者如果我们可以使用类似功能的函数。I希望使用与readLink()相同的功能,如果没有预定义函数,请提供用户定义的函数来替换函数

代码语言:javascript
复制
        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 
EN

回答 3

Stack Overflow用户

发布于 2018-09-09 20:14:39

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

与linux/unix系统上的windows进程不同,windows进程不是一个线性进程。事实上,窗口上实际上有两种不同类型的链接。我强烈建议在尝试跨平台时使用Qt这样的框架。Windows与典型的linux/unix系统完全不同。首先,它不是POSIX系统,必须是linux/unix系统。

票数 0
EN

Stack Overflow用户

发布于 2019-10-31 13:11:05

Windows没有(2)等价物,但它确实有一个(3)等效物:GetFinalPathNameByHandleW()

另见:“如何获得有关符号链接目标的信息?”陈瑞文

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

代码语言:javascript
复制
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”路径,从\\?\开始。

票数 0
EN

Stack Overflow用户

发布于 2022-04-29 01:16:57

Windows上的这段代码在Linux上用作readlink。只需添加错误和大小缓冲区处理不足:

代码语言:javascript
复制
int readlink(const char* pathname, char* link, size_t linksize)
{
    HANDLE h = CreateFileA(pathname, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, NULL);
    char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
    DWORD dwBytesReturned = 0;
    DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, buffer, sizeof(buffer), &dwBytesReturned, 0);
    typedef struct
    {
        ULONG ReparseTag;
        USHORT ReparseDataLength;
        USHORT Reserved;
        union
        {
            struct
            {
                USHORT SubstituteNameOffset;
                USHORT SubstituteNameLength;
                USHORT PrintNameOffset;
                USHORT PrintNameLength;
                ULONG Flags;
                WCHAR PathBuffer[1];
            } SymbolicLinkReparseBuffer;
            struct
            {
                USHORT SubstituteNameOffset;
                USHORT SubstituteNameLength;
                USHORT PrintNameOffset;
                USHORT PrintNameLength;
                WCHAR PathBuffer[1];
            } MountPointReparseBuffer;
            struct
            {
                UCHAR  DataBuffer[1];
            } GenericReparseBuffer;
        };
    } REPARSE_DATA_BUFFER;
    REPARSE_DATA_BUFFER* pRDB = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer);
    if (pRDB->ReparseTag == IO_REPARSE_TAG_SYMLINK)
    {
        int nameLength = pRDB->SymbolicLinkReparseBuffer.SubstituteNameLength / sizeof(wchar_t);
        wchar_t* pName = (wchar_t*)((char*)pRDB->SymbolicLinkReparseBuffer.PathBuffer + pRDB->SymbolicLinkReparseBuffer.SubstituteNameOffset);
        int bytesWritten = WideCharToMultiByte(CP_UTF8, 0, pName, nameLength, link, linksize, NULL, NULL);
        return bytesWritten;
    }
    CloseHandle(h);
    return -1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39785170

复制
相关文章

相似问题

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