0

我使用 dirent 生成文件列表,但我开始担心包含 unicode 字符的目录和文件。

void recurse_dir(char *dir)
{
    DIR* d;
    d = opendir(dir);
    struct dirent* ent;
    unsigned short int dir_size = strlen(dir), tmp_dir_size;
    if(d != NULL)
    {
        while((ent = readdir(d)) != NULL)
        {
            if(ent->d_type == DT_DIR)
            {
                if(!strcmp(ent->d_name,".") || !strcmp(ent->d_name,".."))
                    continue;
                folder_count++;
                char tmp_dir[dir_size + strlen(ent->d_name) + 2];
                tmp_dir[0] = '\0';
                strcat(tmp_dir,dir);
                strcat(tmp_dir,"/");
                strcat(tmp_dir,ent->d_name);
                recurse_dir(tmp_dir);
            }
            else
            {
                file_count++;
                file_strs_size += dir_size + strlen(ent->d_name) + 2;
                fprintf(list_fp, "%s/%s\n",dir, ent->d_name);
            }
        }
    }
    closedir(d);
}

有没有办法让我以宽字符串格式获取 ent->d_name?

4

2 回答 2

0

您可以使用 UTF-8 格式将所有 Unicode 字符存储在 char 数组中。这可能是您的操作系统存储该名称的方式,因此如果您想要 UTF-16 或 UTF-32 格式的名称,您可以使用处理该名称的函数进行转换,例如iconv

于 2015-06-04T13:32:31.270 回答
0

只需运行mbstowcs()文件名。它们采用 UTF-8 格式;该mbstowcs()函数会将其转换为wchar*.

作为旁注,struct dirent.d_type不是很便携。它作为快捷方式/性能优化很有用,但是:

  • 一些文件系统(XFS 是最著名的例子)将始终存储DT_UNKNOWN在该成员中,因此您的代码将在那里失败;
  • 它不是 POSIX 的一部分,因此某些操作系统(例如 Solaris)甚至没有它,因此您的代码不会在那里编译

我的例子中,我使用了switch一些预处理器魔法来在同一代码中处理这两者。

于 2015-06-04T13:46:32.473 回答