【问题标题】:replacement for readlink() function in windows替换windows中的readlink()函数
【发布时间】:2017-02-08 15:46:15
【问题描述】:

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 

【问题讨论】:

  • readlink 特定于 Linux。您是否使用 Visual Studio 构建 linux 应用程序?如果没有,您希望readlink 在没有符号链接的 Windows 上做什么?
  • 是的,我正在使用 Visual Studio,该应用程序应该也适用于 linux 和 windows
  • 事情并非如此。为 Windows 构建的二进制文件不会在 Linux 中运行(没有其他魔法)。
  • 我的应用程序可以检测机器的平台,并且可以在没有用户输入的情况下相应地工作
  • 你没有抓住重点。 Readlink 及其功能与 Windows 无关。您需要弄清楚 linux 版本对 readlink 的作用,而不仅仅是单独查看 readlink。

标签: c++ linux readlink


【解决方案1】:

好的,如 cmets 中所述,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 系统。

【讨论】:

    【解决方案2】:

    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”路径,以 \\?\ 开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 2013-08-09
      • 1970-01-01
      • 2019-12-03
      • 2019-11-21
      • 2013-09-09
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多