2014-01-07 2 views
-1

Я пытаюсь подсчитать файлы в папке, но функция readdir пропускает файлы, содержащие символы Unicode. Я использую dirent, c.dirent не работает с unicode

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; 
} 
+1

Добро пожаловать в переполнение стека. Вскоре прочитайте страницу [О программе]. Один из первых вопросов, который приходит на ум, - «на какой платформе вы работаете?» Следующий вопрос: «Как вы определили, что он пропускает имена файлов Unicode»? В вашем коде не отображаются напечатанные имена. Вы не указали много примеров имен файлов, созданных с именами, отличными от ASCII. Связанный с этим вопрос: используете ли вы имена UTF-8 или UTF-16, что частично связано с вопросом платформы; Linux и Unix используют UTF-8; Вместо этого Windows может использовать UTF-16. –

ответ

2

Попробуйте изменить

if(entry->d_type==DT_REG) 

в

if((entry->d_type==DT_REG || entry->d_type==DT_UNKNOWN) 
    && strcmp(entry->d_name,".")==0 && strcmp(entry->d_name,"..")==0) 

который должен позволить вам посчитать эти файлы путем дальнейшего подсчета файлов неизвестных типов.

Обратите внимание, что strcmp(entry->d_name,".")==0 и strcmp(entry->d_name,"..")==0 используются для исключения подкаталогов.

+0

сейчас, иногда это номер возврата, который выше от фактического количества файлов – user3170449

+0

Иногда? Чем выше количество? – herohuyongtao

+0

добавлено в 2 файлах – user3170449

3

Тестирование на 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.

Смежные вопросы