首页 > 解决方案 > 如何从 OSX 上的 readdir 获取正确的文件名?

问题描述

我试图让我多年前用 ncurses 编写的旧文件管理器程序作为学校项目运行(代码不是很好,可能是一些重构的好练习)。我在 Ubuntu 上创建的,在我的 Macbook 上不起作用。无法弄清楚使它在一个系统上工作的区别,但在另一个系统上却不行。

在 Linux 上运行良好: https ://imageshack.com/a/img922/8487/1Atzsx.jpg

但 OSX 无法正确显示文件名:https ://imageshack.com/a/img923/3640/CeRzCm.png

基于 readdir 中的 d_type 硬编码的类型描述也没有。

起初我认为 ncurses 的广泛字符支持可能存在问题。这在 OSX 上应该默认支持,但要确保我从 Homebrew 安装了最新的 ncurses。没有帮助。

通过这种方式获取文件名并保存到对象中:

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 );
}

但我在这些回报上遇到了分段错误。

有什么建议吗?提前致谢。

标签: c++macosncursesreaddirdirent.h

解决方案


推荐阅读