查看: 1812|回复: 5

如何加载文件夹下所有的ive

[复制链接]

该用户从未签到

发表于 2009-7-28 21:15:11 | 显示全部楼层 |阅读模式
如题~C++程序没怎么写过,想实现这个简单功能不知道怎么写。曾挺一哥们说过,几句话就O了~可俺折腾了一下午也没写出来

有几十个文件夹,近千个max文件。我写了maxscript批量转换max成了ive格式,想读取到osg里放在一个场景里看看。

osgDB里找到如下几句:
OSGDB_EXPORT std::string  findFileInDirectory (const std::string &fileName, const std::string &dirName, CaseSensitivity caseSensitivity=CASE_SENSITIVE)
OSGDB_EXPORT
DirectoryContents  getDirectoryContents (const std::string &dirName)
可是不会用。。。

该用户从未签到

 楼主| 发表于 2009-7-28 21:17:43 | 显示全部楼层
maxscript里这样就读了:
thePath = getSavePath()
if thePath != undefined do
(
theFiles = getFiles (thePath+"\\*.max")
for f in theFiles do
(
resetMaxFile #noPrompt
loadMaxFile f

C++没有maxscript那样的逐句调试,不知道怎么搞。语法好难懂~

该用户从未签到

发表于 2009-7-29 13:03:18 | 显示全部楼层
这个的确是几句话就OK的事情,不必非得用osg函数实现。
用Win32 API的FindFirstFile,FindNextFile吧,具体用法见MSDN

该用户从未签到

 楼主| 发表于 2009-7-29 17:37:47 | 显示全部楼层
找到代码,可是编译进osgmfc里报错~晕死:
void FindFileInDir(char* rootDir, char* strRet)
{
        char fname[MAC_FILENAMELENOPATH];
        ZeroMemory(fname, MAC_FILENAMELENOPATH);

        WIN32_FIND_DATA fd;
        ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));

        HANDLE hSearch;
        char filePathName[256];
        char tmpPath[256];
        ZeroMemory(filePathName, 256);
        ZeroMemory(tmpPath, 256);

        strcpy(filePathName, rootDir);

        BOOL bSearchFinished = FALSE;

        if( filePathName[strlen(filePathName) -1] != '\\' )
        {
                strcat(filePathName, "\\");
        }

        strcat(filePathName, "*");

        hSearch = FindFirstFile(filePathName, &fd);

        //Is directory
        if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )               
        {
                strcpy(tmpPath, rootDir);
                strcat(tmpPath, fd.cFileName);
                FindFileInDir(tmpPath, strRet);
        }
       
        else        if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
                                {
                                        sprintf(fname, "%-50.50s", fd.cFileName);
                                        strcat(strRet + strRet[strlen(strRet)] , fname);
                                }

        while( !bSearchFinished )
        {
                if( FindNextFile(hSearch, &fd) )
                {
                        if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                                && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )               
                        {
                                strcpy(tmpPath, rootDir);
                                strcat(tmpPath, fd.cFileName);
                                FindFileInDir(tmpPath, strRet);
                        }
       
                        else        if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..") )
                                                {
                                                        sprintf(fname, "%-50.50s", fd.cFileName);
                                                        strcat(strRet + strRet[strlen(strRet)] , fname);
                                                }
                }
                else
                {
                        if( GetLastError() == ERROR_NO_MORE_FILES )                        //Normal Finished
                        {
                                bSearchFinished = TRUE;
                        }
                        else
                                bSearchFinished = TRUE;                //Terminate Search
                }
        }

        FindClose(hSearch);
       
}

该用户从未签到

发表于 2009-7-30 00:56:02 | 显示全部楼层
照抄是最不好的习惯。
所以现在论坛上不提倡直接提供大段的代码来解答问题了,很不利于您的学习~~呵呵

该用户从未签到

 楼主| 发表于 2009-7-30 18:38:49 | 显示全部楼层
搞定了~用win32API实在是复杂~经哥们指导,用osgDB:irectoryContents解决

没人指导真的不知道杂么弄哦。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表