博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ogre读取中文路径名的文件失败的解决办法
阅读量:6696 次
发布时间:2019-06-25

本文共 1431 字,大约阅读时间需要 4 分钟。

Ogre的文件读取是使用的标准库的io库读取的,众所周知的是,在vs2005是存在着bug的。

因此想要一劳永逸的解决这个办法唯有去修改Ogre的源代码,以下为修改方法:


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

None.gifDataStreamPtr FileSystemArchive::open(
const String& filename) 
const
ExpandedBlockStart.gif     {
InBlock.gif        String full_path = concatenate_path(mName, filename);
InBlock.gif
InBlock.gif        
//
 Use filesystem to determine size 
InBlock.gif        
//
 (quicker than streaming to the end and back)
InBlock.gif
        
struct stat tagStat;
InBlock.gif        
int ret = stat(full_path.c_str(), &tagStat);
InBlock.gif        assert(ret == 0 && "Problem getting file size" );
InBlock.gif
InBlock.gif        
//
 Always open in binary mode
InBlock.gif
        
static std::vector<wchar_t>    s_wchar_buf((size_t)128);
InBlock.gif        size_t lengthUnicode = MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), NULL, 0);
InBlock.gif        
if (s_wchar_buf.size() < lengthUnicode + 1)
ExpandedSubBlockStart.gif        {
InBlock.gif            s_wchar_buf.resize(lengthUnicode * 2);
ExpandedSubBlockEnd.gif        }
InBlock.gif        wchar_t* szUnicode = &s_wchar_buf[0];
InBlock.gif        MultiByteToWideChar(CP_ACP, 0, full_path.c_str(), full_path.size(), szUnicode, lengthUnicode);
InBlock.gif        szUnicode[lengthUnicode] = 0;
InBlock.gif        std::ifstream* origStream = 
new std::ifstream();
InBlock.gif        origStream->open(szUnicode, std::ios::
in | std::ios::binary);
InBlock.gif
InBlock.gif        
//
 Should check ensure open succeeded, in case fail for some reason.
InBlock.gif
        
if (origStream->fail())
ExpandedSubBlockStart.gif        {
InBlock.gif            delete origStream;
InBlock.gif            OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
InBlock.gif                "Cannot open file: " + filename,
InBlock.gif                "FileSystemArchive::open");
ExpandedSubBlockEnd.gif        }
InBlock.gif
ExpandedSubBlockStart.gif        
///
 Construct return stream, tell it to delete on destroy
InBlock.gif        FileStreamDataStream* stream = 
new FileStreamDataStream(filename,
InBlock.gif            origStream, tagStat.st_size, 
true);
InBlock.gif        
return DataStreamPtr(stream);
ExpandedBlockEnd.gif    }

转载地址:http://vxtoo.baihongyu.com/

你可能感兴趣的文章
面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用~续(TestBase继承ITest是多余的?)...
查看>>
MacOS下MySQL配置
查看>>
jumpserver v0.4.0 基于 CenOS7 的安装详解
查看>>
WF4.0:NativeActivity中的错误处理
查看>>
百度地图定位地址为空
查看>>
第 11 章 Paragraphs
查看>>
Redis在windows下的配置
查看>>
对互联网中常见地图的坐标系探讨
查看>>
44.2. JavaScript Charts
查看>>
C#设计模式(19)——状态者模式(State Pattern)
查看>>
ubuntun安装ssh,并远程链接服务器操作
查看>>
[唐诗]182宫中行乐词(其一)-李白
查看>>
设计模式之禅之六大设计原则-依赖倒置原则
查看>>
ML2 配置 OVS VxLAN - 每天5分钟玩转 OpenStack(146)
查看>>
【转】TCP协议的无消息边界问题
查看>>
SQL Server-数据类型(七)
查看>>
Android Studio项目整合PullToRefresh的问题记录
查看>>
Variant 与 内存泄露
查看>>
WebSocket实战之————GatewayWorker使用笔记例子
查看>>
动手实践 Linux VLAN - 每天5分钟玩转 OpenStack(13)
查看>>