c++ - 如何从 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 );
}
但我在这些回报上遇到了分段错误。
有什么建议吗?提前致谢。
解决方案
推荐阅读
- php - 在 findBy 之后,Doctrine 重写了与急切获取值的关系
- javascript - 如何以编程方式在铬中添加 HTML DOM 断点?
- instagram-api - 如何使用 API 从 instagram 获取业务页面图标?
- r - 使用 R 将 Cloudera Workbench 上执行的脚本中的 HUE 表保存到我的笔记本电脑上
- java - 创建自定义gradle插件分析java源码并生成代码
- html - 为什么对表格数据使用 div 而不是表格?
- javascript - 如何在 JSFiddle 中模拟 Ajax 请求
- html - 为什么我的 Angular 应用程序显示我的 html 文件的路径而不是其内容?
- node.js - 如何修复此功能,以检索包含搜索关键字的数据?
- c# - 无法在 WPF 中创建继承的用户控件,本地命名空间中的基本控件“不存在”