牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

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

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 杨粼波 阅读(2332) 评论(4)  编辑 收藏 引用

评论

# re: Ogre读取中文路径名的文件失败的解决办法 2010-09-05 19:16 风生竹韵

用setlocale(LC_ALL,"Chinese-simplified");就可以了。  回复  更多评论   

# re: Ogre读取中文路径名的文件失败的解决办法[未登录] 2010-09-12 00:56 杨粼波

你知道setlocale这个方法的代价有多大么?会带来什么影响么?  回复  更多评论   

# re: Ogre读取中文路径名的文件失败的解决办法[未登录] 2013-09-07 20:37 ds

@杨粼波
setlocale会带来很多其它的字符问题  回复  更多评论   

# re: Ogre读取中文路径名的文件失败的解决办法[未登录] 2013-09-10 02:49 杨粼波

@ds
开销也是颇大的.反正,不赞成用这个...  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理