Как получить правильные имена файлов из readdir на OSX? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь запустить мою старую программу управления файлами, которую я кодировал несколько лет назад, с помощью ncurses как школьный проект (код не очень хороший, может быть хорошим упражнением для некоторого рефакторинга).Я создал его на Ubuntu, не работает на моем Macbook.Не могу понять разницу, которая заставляет его работать в одной системе, но не в другой.

Отлично работает в Linux: https://imageshack.com/a/img922/8487/1Atzsx.jpg

Но OSX не отображает имена файлов правильно:https://imageshack.com/a/img923/3640/CeRzCm.png

Также нет описания типов, которые жестко закодированы на основе d_type из readdir.

Сначала я подумал, что может быть проблема с поддержкой широких символов из ncurses.Это должно поддерживаться по умолчанию в OSX, но чтобы быть уверенным, что я установил последние ncurses от Homebrew.Не помогло.

Имена файлов получены таким образом и сохранены в объекты:

struct dirent *ent;
DIR *dir;
if((dir = opendir(path.c_str())) != NULL) {
    for(auto it = m_files.begin(); it != m_files.end(); ++it) {
        delete *it;
    }
    m_files.clear();

    while((ent = readdir (dir)) != NULL) {

        if(ent->d_type==DT_DIR) {
            if(!root) {
                m_files.push_back( new CDirectory(ent->d_name, path+"/"+ent->d_name) );
            }else{
                m_files.push_back( new CDirectory(ent->d_name, path+ent->d_name) );
            }
        }

Затем к этим объектам обращаются, чтобы создать элементы для меню ncurses.Valgrind обнаруживает здесь утечки памяти (не происходит с тем же кодом в Ubuntu).

void CSelection::CreateItems () {

    size_t number_of_choices = m_files.size();
    size_t i;

    m_items = (ITEM **)calloc(number_of_choices+1, sizeof(ITEM *));
    for(i = 0; i < number_of_choices; i++) {
        m_items[i] = new_item(m_files[i]->GetName().c_str(), m_files[i]->GetType().c_str());
    }
    m_items[i] = NULL;
}

После некоторых исследований я думаю, что у меня та же проблема, что и здесь: https://github.com/rust-lang/libc/issues/414, но язастрял на реализации исправления.

Я пытался включить этот код (найден здесь: https://forums.coronalabs.com/topic/53249-link-errors-with-openssl-plugin-when-building-universal-32-64-bit-binaries-for-ios/),

#include <dirent.h>
#include <fnmatch.h>

extern "C" DIR * opendir$INODE64( char * dirName );
DIR * opendir$INODE64( char * dirName )
{
    return opendir( dirName );
}

extern "C" struct dirent * readdir$INODE64( DIR * dir );
struct dirent * readdir$INODE64( DIR * dir )
{
    return readdir( dir );
}

, но я получаю ошибку сегментации в этих возвратах.

Любойсовет? Спасибо заранее.

...