Тестирование на 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;
}
Следует отметить, что в нем перечислены все записи, как это возвращается - инода, тип и имя. В Mac OS X мне сказали, что тип inode был __uint64_t
aka 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 ЗНАК ЗВУКА, так что он находится в диапазоне латинского алфавита 1 (ISO 8859-1, 8859-15). Символом торговой марки ™ является U + 2122 TRADE MARK SIGN, также вне диапазона обычных однобайтовых кодовых наборов.
Это показывает, что по крайней мере на некоторых платформах readdir()
отлично работает с именами кодированных файлов UTF-8, используя символы Unicode, которые не находятся в наборе символов Latin1. Он также демонстрирует, как я буду отлаживать проблему - и/или иллюстрирует то, что я хочу, чтобы вы запускали (программа выше) и вид каталога, в котором вы должны запускать его, чтобы сделать ваш случай, что readdir()
на вашей платформе а не как имена файлов Unicode.
Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Один из первых вопросов, который приходит на ум, - «на какой платформе вы работаете?» Следующий вопрос: «Как вы определили, что он пропускает имена файлов Unicode»? В вашем коде не отображаются напечатанные имена. Вы не указали много примеров имен файлов, созданных с именами, отличными от ASCII. Связанный с этим вопрос: используете ли вы имена UTF-8 или UTF-16, что частично связано с вопросом платформы; Linux и Unix используют UTF-8; Вместо этого Windows может использовать UTF-16. –