2015-06-04 1 views
0

Я создаю список файлов, используя dirent, но я беспокоюсь о каталогах и файлах, содержащих символы Unicode.Есть ли способ получить dirent's ent-> d_name как w_char *?

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_ в широкоформатном формате?

ответ

0

Вы можете хранить все символы Юникода в массиве символов, используя формат UTF-8. Вероятно, это то, как ваша ОС хранит это имя, поэтому, если вы хотите, чтобы имя в UTF-16 или UTF-32 выполнялось с помощью функции, которая позаботится об этом, например iconv.

0

Просто запустите mbstowcs() над именем файла. Они находятся в UTF-8; функция mbstowcs() преобразует ее в wchar*.

В качестве примечания стороны, struct dirent.d_type не очень портативен. Это полезно в качестве оптимизации ярлык/производительность, но:

  • некоторые файловые системы (XFS является наиболее известным примером) всегда будет хранить DT_UNKNOWN в этом элементе, так что ваш код не сможет там;
  • Это не часть POSIX, поэтому некоторые операционные системы (например, Solaris) даже не имеют этого, поэтому ваш код не будет компиляции.

В my case, я использовал switch и немного препроцессора магии обрабатывать как в том же коде.

+0

Обратите внимание, что в то время как, например, на linux, UTF-8 обычно является кодировкой по умолчанию, и, следовательно, имена файлов, как правило, заканчиваются как UTF-8. Но имена файлов могут храниться в любой кодировке или даже некорректной кодировке. Единственными недопустимыми символами являются nul-терминатор и /. Таким образом, вам обычно лучше не делать никаких манипуляций или конверсий по именам файлов – nos