将 Unix 移植到 Windows - pwd.h 的使用

2024-02-03

我正在尝试编译库尼汉 http://sourceforge.net/projects/libunihan/使用 MinGW 编写代码,但遇到了需要移植的功能。该函数的目的是获得规范的路径表示。它用pwd.h(这是 POSIX,而 MinGW 不是),因此它可以通过检索 '~' 来解释主目录的使用passwd结构体,其中包含pw_dir。我确实找到了一些信息here http://www.suacommunity.com/dictionary/getpwnam-entry.php,以及一个端口realpath here http://www.cplusplus.com/reference/cstring/strchr/,但我仍然完全不知道如何处理这个问题。使用 MinGW,我仍然有一个主目录,表示为~并位于/home/nate,但由于它不是 POSIX,所以我没有pwd.h帮助我找到这个主目录在哪里。

Q:如何移植以下功能才能与 MinGW 正常工作?

/**
 * Return the canonicalized absolute pathname.
 *
 * It works exactly the same with realpath(3), except this function can handle the path with ~,
 * where realpath cannot.
 *
 * @param path The path to be resolved.
 * @param resolved_path Buffer for holding the resolved_path.
 * @return resolved path, NULL is the resolution is not sucessful.
 */
gchar*
truepath(const gchar *path, gchar *resolved_path){
    gchar workingPath[PATH_MAX];
    gchar fullPath[PATH_MAX];
    gchar *result=NULL;
    g_strlcpy(workingPath,path,PATH_MAX);

//     printf("*** path=%s \n",path);

    if ( workingPath[0] != '~' ){
        result = realpath(workingPath, resolved_path);
    }else{
        gchar *firstSlash, *suffix, *homeDirStr;
        struct passwd *pw;

        // initialize variables
        firstSlash = suffix = homeDirStr = NULL;

    firstSlash = strchr(workingPath, DIRECTORY_SEPARATOR);
        if (firstSlash == NULL)
            suffix = "";
        else
        {
            *firstSlash = 0;    // so userName is null terminated
            suffix = firstSlash + 1;
        }

        if (workingPath[1] == '\0')
            pw = getpwuid( getuid() );
        else
            pw = getpwnam( &workingPath[1] );

        if (pw != NULL)
            homeDirStr = pw->pw_dir;

        if (homeDirStr != NULL){
        gint ret=g_sprintf(fullPath, "%s%c%s", homeDirStr, DIRECTORY_SEPARATOR, suffix);
        if (ret>0){
        result = realpath(fullPath, resolved_path);
        }

    }
    }
    return result;
}

目的是为了实现~[username]/重新映射逻辑。此类代码在 Linux/UNIX 环境中有意义,但最常见的用途只是引用用户自己的主目录。

为了方便起见,我只是添加对常见情况的支持 -~/- 即当前用户,并且不费心支持更一般的情况 - 在这种情况下它会失败并出现明显的错误。

获取当前用户主目录的函数是SHGetFolderPath http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181.aspx.

#include <windows.h>

char homeDirStr[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, homeDirStr))) {
    // Do something with the path
} else {
    // Do something else
}

如果用户查找失败,您粘贴的代码不会尝试替换该字符串,而只是返回NULL,所以你可以模仿它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Unix 移植到 Windows - pwd.h 的使用 的相关文章

随机推荐

  • 避免 R 中的 for 循环

    我想要一些关于编写更好的 R 代码的建议 我目前在 R 中编写了一个循环 但它存在性能问题 我无法集中精力对其进行矢量化 因为输出数据帧中的每一行都依赖于较早的行 并且它们会迭代地向下流动 因此我编写了一个循环来按顺序读 写行 我的代码示例
  • ruby-method_missing 返回无方法错误

    我正在尝试使用 method missing 将美元转换为不同的货币 class Numeric currency euro gt 2 yen gt 6 def method missing method id args block met
  • 类型错误:performanceMeasurement.startMeasurement 不是函数

    当尝试在 Next 13 中从 azure msal react 登录时 就发生了错误 当我检查错误日志时 它来自核心库 azure msal react 我也尝试过登录弹出窗口 但错误仍然相同 我有代码 在我的auth ts export
  • 使用 urllib2 进行 POST 调用而不是 GET

    关于 urllib2 和 POST 调用有很多东西 但我遇到了一个问题 我正在尝试对服务进行简单的 POST 调用 url http myserver post service data urllib urlencode name joe
  • 编译时错误和无法访问的代码

    好的 考虑下面的代码 private const int THRESHHOLD 2 static void Main string args string hello if THRESHHOLD gt 1 return Console Wr
  • ggplot更改网格以适应每月数据

    我有一个为期 1 年的数据集 名为afs20 其结构如下 datum包含数据点的日期 maand包含数据点的月份 delta包含目标变量 o ggplot afs20 o geom point aes x datum y delta sta
  • 使用 XPath 获取具有默认命名空间(无命名空间前缀)的元素

    在这个 SOAP XML 文件中 我怎样才能获得7关于使用 XPath 查询
  • Mono 编译器 // 终端模拟器问题

    当我尝试编译 csharp 或 fsharp 文件时出现此错误 使用 gnome 终端或 jetbrain rider 时会发生这种情况 它在 tty 或 xterm 和 urxvt 等终端中运行良好 我还能够编译 c c 和 go 代码
  • 提取服务器证书

    我需要帮助获取适当的代码片段来获取服务器证书 有效和无效 由 CA 签名和自签名 任何链接和参考都将受到高度赞赏 我有一个 UNIX 命令 它可以提供我想要的结果 但我想要使用 Java 得到相同的输出 UNIX 中的命令是这样的 echo
  • ItemTemplate 和 ItemContainerStyle 不能一起使用吗?

    我正在尝试将 ItemTemplate 和 ItemContainerStyle 应用于 ItemsControl
  • 更改 UIActionSheet 中项目的文本颜色 - iOS 8

    我一直在使用以下代码来更改我添加的项目的文本颜色UIActionSheet void willPresentActionSheet UIActionSheet actionSheet for UIView subview in action
  • 如何可移植地扩展使用 mmap() 访问的文件

    我们正在尝试改变 SQLite 一个嵌入式数据库系统 使用 mmap 而不是通常的 read 和 write 调用来访问 磁盘上的数据库文件 对整个数据使用单个大映射 文件 假设文件足够小 我们没有问题 在虚拟内存中为此寻找空间 到目前为止
  • Keras - 从一个神经网络做出两个预测

    我正在尝试组合由同一网络产生的两个输出 该网络对 4 类任务和 10 类任务进行预测 然后我希望将这些输出组合起来 得到一个长度为 14 的数组 我将其用作最终目标 虽然这似乎很有效 但预测总是针对一个类别 因此它会产生一个概率分布 该概率
  • 如何使用 NSVisualEffectView 制作平滑、圆润、类似体积的 OS X 窗口?

    I m currently trying to make a window that looks like the Volume OS X window 为了做到这一点 我有自己的NSWindow 使用自定义子类 它是透明的 无标题栏 无阴
  • 插入到java.util.List中的任意位置

    根据文档 您可以将对象插入列表中的任何位置 该界面的用户可以精确控制每个元素在列表中的插入位置 来源 http download oracle com javase 6 docs api java util List html http d
  • 使用shared_ptr的派生类对象的向量

    我有这些课程 class Element class Button public Element class Label public Element class Input public Element 我希望能够创建一个void add
  • Chart.js:组合线形和条形数据

    我想创建一个图表Chart js http www chartjs org 包含两个不同的数据集 一个线数据集和一个条形数据集 您可以在这里查看我的完整代码 function initCombinedChart canvas each fu
  • ruby 访问静态变量

    class A ololo 1 end A ololo A new ololo NoMethodError undefined method ololo 好的 我需要一个 attr reader class B ololo 1 attr r
  • Tensorflow 安装和导入正确,但在尝试使用时抛出异常

    我在使用张量流时遇到问题 看来安装和导入正确 然而 当我调用它时 解释器会抛出一长串异常 其节略如下 我使用的是 OS X El Capitan v 10 11 6 Macbook Pro 15 英寸 2009 年中 2 8 GHz 英特尔
  • 将 Unix 移植到 Windows - pwd.h 的使用

    我正在尝试编译库尼汉 http sourceforge net projects libunihan 使用 MinGW 编写代码 但遇到了需要移植的功能 该函数的目的是获得规范的路径表示 它用pwd h 这是 POSIX 而 MinGW 不