您的位置:首页 > 其它

Ogre读取中文路径名的文件失败的解决办法

2011-04-23 11:40 369 查看
Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的。
因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法:

打开OgreFileSystem.cpp文件,找到FileSystemArchive::open方法,使用以下代码替换之:

DataStreamPtr FileSystemArchive::open(const String& filename) const
String full_path = concatenate_path(mName, filename);

// Use filesystem to determine size
// (quicker than streaming to the end and back)
struct stat tagStat;
int ret = stat(full_path.c_str(), &tagStat);
assert(ret == 0 && "Problem getting file size" );

// Always open in binary mode
static std::vector<wchar_t> s_wchar_buf((size_t)128);
size_t lengthUnicode = MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), NULL, 0);
if (s_wchar_buf.size() < lengthUnicode + 1)
s_wchar_buf.resize(lengthUnicode * 2);
}
wchar_t* szUnicode = &s_wchar_buf[0];
MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), szUnicode, lengthUnicode);
szUnicode[lengthUnicode] = 0;
std::ifstream* origStream = new std::ifstream();
origStream->open(szUnicode, std::ios::in | std::ios::binary);

// Should check ensure open succeeded, in case fail for some reason.
if (origStream->fail())
delete origStream;
OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
"Cannot open file: " + filename,
"FileSystemArchive::open");
}

/**//// Construct return stream, tell it to delete on destroy
FileStreamDataStream* stream = new FileStreamDataStream(filename,
origStream, tagStat.st_size, true);
return DataStreamPtr(stream);
}

posted on 2008-12-09 03:42 杨粼波 阅读(957) 评论(2) 编辑 收藏 引用


//Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]>

Feedback

# re: Ogre读取中文路径名的文件失败的解决办法 2010-09-05 19:16 风生竹韵
用setlocale(LC_ALL,"Chinese-simplified");就可以了。 回复 更多评论


# re: Ogre读取中文路径名的文件失败的解决办法[未登录] 2010-09-12 00:56 杨粼波
你知道setlocale这个方法的代价有多大么?会带来什么影响么? 回复 更多评论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: