1.文件系统的作用
FileUtils是Cocos2d-x里面的文件管理类。它对我们游戏中的资源文件起到管理作用,可以说是游戏资源管理的大管家。FileUtils可以进行读写文件,可以设置搜索路径,可以获得资源文件的绝对路径和相对路径,可以判断文件和文件夹是否存在,可以获得资源文件的大小等。很多对文件操作的所需功能FileUtils都有对应的接口。所以说,没有FileUtils的存在,Cocos是不完整的。
2.文件系统的使用
文件系统的使用主要体现在如下几方面:
1).如何获得Fileutils的单例对象
2).如何通过Fileutils添加搜索路径
3).如何通过Fileutils写入数据
4).如何通过Fileutils读取数据
5).如何通过Fileutils判断文件以及文件夹是否存在
6).如何通过Fileutils创建和删除文件夹
2.1如何获得Fileutils的单例对象并通过Fileutils添加搜索路径:
//Fileutils对象获得 //获得一个Fileutils的静态单例对象 FileUtils * fUtils = FileUtils::getInstance(); //声明一个vector用来存放可搜索路径文件夹名 std::vector<std::string> _searchPaths; //创建文件夹名字 std::string dirString = "test"; //将文件夹名添加到vector中 _searchPaths.push_back(dirString); //添加到可搜索路径中 fUtils->setSearchPaths(_searchPaths);
设置可搜索路径的作用:当设置可搜索路径后,我们使用到可搜索路径文件夹下面的资源时,程序会到该路径下自动查找,若没有设置则找不到。
比如说Resources-res目录下有HelloWorld.png和MainScene.csb文件,如果没有把“res”添加到可搜索路径中,我们使用MainScene.csb会找不到。我们在HelloWorldScene.cpp的init()方法中看到如下代码:
auto rootNode = CSLoader::createNode("MainScene.csb");
那么“res”是在哪里设置的可搜索路径的呢?
我们到AppDelegate.cpp的applicationDidFinishLaunching()方法中可以看到如下代码:
FileUtils::getInstance()->addSearchPath("res");
其实在这里添加了res的可搜索路径啦,我们实际工程一般添加可搜索路径也是在AppDelegate中添加的。
另外addSearchPath()和setSearchPaths()方法有什么区别呢?首先addSearchPath()是使用字符串作为参数的,setSearchPaths()是使用vector作为参数的;其次,作用不一样,虽然都为将文件添加到可搜索路径中,但两者优先级不一样。当查找可搜索路径资源时,优先找setSearchPaths添加的资源,若找不到则再查找addSearchPath添加的资源,热更新也是利用的这一特性。
2.2通过Fileutils写入数据:
//获得可写路径 std::string writePath = fUtils->getWritablePath(); //文件名 std::string fileName = writePath + "test"; //声明数组存储写入字符 char buf[100] = "HelloCocos2d-x"; //创建File对象,不是创建文件夹啊 //第一个参数为filename //第二个参数为打开模式 FILE * file = fopen(fileName.c_str(),"wb"); //将字符写入到文件中 //返回的st作用是标识写入是否成功 if (file){ size_t st = fwrite(buf,1,strlen(buf),file); }
2.3通过Fileutils判断文件以及文件夹是否存在:
//判断文件是否存在 bool isExit; isExit = fUtils->isFileExist("res/HelloWorld.png"); //判断文件夹是否存在 isExit = fUtils->isDirectoryExist(fUtils->fullPathForFilename("res"));
2.4创建文件夹:
//拼文件夹的路径 std::string writePath = fUtils->getWritablePath(); std::string dirPath = writePath + "_test"; //创建文件夹 //返回值标识是否创建成功 bool ok = fUtils->createDirectory(dirPath);
最后,总结一下:
对资源添加搜索路径、判断文件、文件夹是否存在,以及创建文件、文件夹都是通过 FileUtils的一个单例对象来执行的,分别调用了其setSearchPaths()、isFileExist()、isDirectoryExist()、createDirectory()等方法;读写数据时 FileUtils类的职责只是其单例对象通过getWritablePath()方法提供可写路径。
以上,如果哪里有问题欢迎留言一起交流讨论哈!