gpt4 book ai didi

c - dirent 不使用 unicode

转载 作者:太空宇宙 更新时间:2023-11-04 05:40:15 29 4
gpt4 key购买 nike

我尝试对文件夹中的文件进行计数,但 readdir 函数会跳过包含 unicode 字符的文件。我在 c 中使用 dirent。

int filecount(char* path)
{
int file_Count=0;
DIR* dirp;
struct dirent * entry;
dirp = opendir(path);
while((entry=readdir(dirp)) !=NULL)
{
if(entry->d_type==DT_REG)
{
++file_Count;
}
}
closedir(dirp);
return file_Count;
}

最佳答案

在 Mac OS X 10.9.1 Mavericks 上测试,我将你的代码改编成以下完整程序:

#include <dirent.h>
#include <stdio.h>

static
int filecount(char *path)
{
int file_Count = 0;
DIR *dirp;
struct dirent *entry;
dirp = opendir(path);
while ((entry = readdir(dirp)) != NULL)
{
printf("Found (%llu)(%d): %s\n", entry->d_ino, entry->d_type, entry->d_name);
if (entry->d_type == DT_REG)
{
++file_Count;
}
}
closedir(dirp);
return file_Count;
}

static void proc_dir(char *dir)
{
printf("Processing %s:\n", dir);
printf("File count = %d\n", filecount(dir));
}

int main(int argc, char **argv)
{
if (argc > 1)
{
for (int i = 1; i < argc; i++)
proc_dir(argv[i]);
}
else
proc_dir(".");
return 0;
}

值得注意的是,它在返回时列出了每个条目—— inode 、类型和名称。在 Mac OS X 上,我被告知 inode 类型是 __uint64_t 又名 unsigned long long,因此使用 %llu 作为格式; YMMV 关于这一点。

我还创建了一个文件夹 utf8 并在该文件夹中创建了文件:

total 32
-rw-r--r-- 1 jleffler eng 6 Jan 7 12:14 ÿ-y-umlaut
-rw-r--r-- 1 jleffler eng 6 Jan 7 12:15 £
-rw-r--r-- 1 jleffler eng 6 Jan 7 12:14 €
-rw-r--r-- 1 jleffler eng 6 Jan 7 12:15 ™

每个文件都包含 Hello 加上换行符。当我运行命令(我称之为 fc)时,它给出:

$ ./fc utf8
Processing utf8:
Found (8138036)(4): .
Found (377579)(4): ..
Found (8138046)(8): ÿ-y-umlaut
Found (8138067)(8): £
Found (8138054)(8): €
Found (8138078)(8): ™
File count = 4
$

欧元符号 € 是 U+20AC EURO SIGN,远远超出了普通单字节代码集的范围。英镑符号 £ 是 U+00A3 POUND SIGN,因此它在拉丁 1 字母表(ISO 8859-1、8859-15)的范围内。商标符号™为U+2122 TRADE MARK SIGN,也不在普通单字节码集范围内。

这表明至少在某些平台上,readdir() 使用不在 Latin1 字符集中的 Unicode 字符来处理 UTF-8 编码文件名。它还演示了我将如何着手调试问题 — 和/或说明我希望您运行什么(上面的程序)以及您应该在哪种目录上运行它以使您的案例 readdir( ) 在您的平台上不喜欢 Unicode 文件名。

关于c - dirent 不使用 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20979727/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com