readLink()存在于linux中,定义为unistd.h,windows中是否有类似类型的函数请提供,或者如果我们可以使用类似功能的函数。I希望使用与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 发布于 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系统。
发布于 2019-10-31 13:11:05
Windows没有(2)等价物,但它确实有一个(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”路径,从\\?\开始。
发布于 2022-04-29 01:16:57
Windows上的这段代码在Linux上用作readlink。只需添加错误和大小缓冲区处理不足:
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;
}https://stackoverflow.com/questions/39785170
复制相似问题