2013-04-10 11:45:55 +08:00
|
|
|
/*
|
2013-06-20 14:13:12 +08:00
|
|
|
* FileUtilsLinux.cpp
|
2013-04-10 11:45:55 +08:00
|
|
|
*
|
|
|
|
* Created on: Aug 9, 2011
|
|
|
|
* Author: laschweinski
|
|
|
|
*/
|
|
|
|
#include "CCFileUtilsLinux.h"
|
|
|
|
#include "platform/CCCommon.h"
|
|
|
|
#include "ccMacros.h"
|
|
|
|
#include "CCApplication.h"
|
2013-10-14 14:01:00 +08:00
|
|
|
#include "CCString.h"
|
2013-04-10 11:45:55 +08:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
|
2013-07-12 12:03:39 +08:00
|
|
|
FileUtils* FileUtils::getInstance()
|
2013-04-10 11:45:55 +08:00
|
|
|
{
|
|
|
|
if (s_sharedFileUtils == NULL)
|
|
|
|
{
|
2013-06-20 14:13:12 +08:00
|
|
|
s_sharedFileUtils = new FileUtilsLinux();
|
2013-07-23 20:44:08 +08:00
|
|
|
if(!s_sharedFileUtils->init())
|
|
|
|
{
|
|
|
|
delete s_sharedFileUtils;
|
|
|
|
s_sharedFileUtils = NULL;
|
|
|
|
CCLOG("ERROR: Could not init CCFileUtilsLinux");
|
|
|
|
}
|
2013-04-10 11:45:55 +08:00
|
|
|
}
|
|
|
|
return s_sharedFileUtils;
|
|
|
|
}
|
|
|
|
|
2013-06-20 14:13:12 +08:00
|
|
|
FileUtilsLinux::FileUtilsLinux()
|
2013-04-10 11:45:55 +08:00
|
|
|
{}
|
|
|
|
|
2013-06-20 14:13:12 +08:00
|
|
|
bool FileUtilsLinux::init()
|
2013-04-10 11:45:55 +08:00
|
|
|
{
|
2013-04-10 18:39:01 +08:00
|
|
|
// get application path
|
|
|
|
char fullpath[256] = {0};
|
|
|
|
ssize_t length = readlink("/proc/self/exe", fullpath, sizeof(fullpath)-1);
|
|
|
|
|
|
|
|
if (length <= 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
fullpath[length] = '\0';
|
2013-04-11 08:58:48 +08:00
|
|
|
std::string appPath = fullpath;
|
2013-06-15 14:03:30 +08:00
|
|
|
_defaultResRootPath = appPath.substr(0, appPath.find_last_of("/"));
|
|
|
|
_defaultResRootPath += "/../../../Resources/";
|
2013-04-10 18:39:01 +08:00
|
|
|
|
2013-04-11 09:20:25 +08:00
|
|
|
// Set writable path to $XDG_CONFIG_HOME or ~/.config/<app name>/ if $XDG_CONFIG_HOME not exists.
|
|
|
|
const char* xdg_config_path = getenv("XDG_CONFIG_HOME");
|
|
|
|
std::string xdgConfigPath;
|
|
|
|
if (xdg_config_path == NULL) {
|
|
|
|
xdgConfigPath = getenv("HOME");
|
|
|
|
xdgConfigPath += "/.config";
|
|
|
|
} else {
|
|
|
|
xdgConfigPath = xdg_config_path;
|
|
|
|
}
|
2013-06-15 14:03:30 +08:00
|
|
|
_writablePath = xdgConfigPath;
|
|
|
|
_writablePath += appPath.substr(appPath.find_last_of("/"));
|
|
|
|
_writablePath += "/";
|
2013-04-10 11:45:55 +08:00
|
|
|
|
2013-06-20 14:13:12 +08:00
|
|
|
return FileUtils::init();
|
2013-04-10 11:45:55 +08:00
|
|
|
}
|
|
|
|
|
2013-09-07 13:52:23 +08:00
|
|
|
string FileUtilsLinux::getWritablePath() const
|
2013-04-10 11:45:55 +08:00
|
|
|
{
|
2013-04-11 08:58:48 +08:00
|
|
|
struct stat st;
|
2013-06-15 14:03:30 +08:00
|
|
|
stat(_writablePath.c_str(), &st);
|
2013-04-11 08:58:48 +08:00
|
|
|
if (!S_ISDIR(st.st_mode)) {
|
2013-06-15 14:03:30 +08:00
|
|
|
mkdir(_writablePath.c_str(), 0744);
|
2013-04-11 08:58:48 +08:00
|
|
|
}
|
|
|
|
|
2013-06-15 14:03:30 +08:00
|
|
|
return _writablePath;
|
2013-04-10 11:45:55 +08:00
|
|
|
}
|
|
|
|
|
2013-09-07 13:52:23 +08:00
|
|
|
bool FileUtilsLinux::isFileExist(const std::string& strFilePath) const
|
2013-04-10 11:45:55 +08:00
|
|
|
{
|
2013-04-25 21:51:13 +08:00
|
|
|
if (0 == strFilePath.length())
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-04-10 11:45:55 +08:00
|
|
|
std::string strPath = strFilePath;
|
|
|
|
if (!isAbsolutePath(strPath))
|
|
|
|
{ // Not absolute path, add the default root path at the beginning.
|
2013-06-15 14:03:30 +08:00
|
|
|
strPath.insert(0, _defaultResRootPath);
|
2013-04-10 11:45:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
struct stat sts;
|
|
|
|
return (stat(strPath.c_str(), &sts) != -1) ? true : false;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_CC_END
|