Path类细节调整

This commit is contained in:
Nomango 2018-07-04 12:49:05 +08:00
parent 8c246df955
commit 17d73916ba
18 changed files with 109 additions and 104 deletions

View File

@ -28,7 +28,7 @@ e2d::Animation::~Animation()
void e2d::Animation::setInterval(double interval) void e2d::Animation::setInterval(double interval)
{ {
_interval = max(interval, 0); _interval = std::max(interval, 0.0);
} }
void e2d::Animation::onDestroy() void e2d::Animation::onDestroy()

View File

@ -2,7 +2,7 @@
e2d::Delay::Delay(double duration) e2d::Delay::Delay(double duration)
: _delta(0) : _delta(0)
, _delay(max(duration, 0)) , _delay(std::max(duration, 0.0))
{ {
} }

View File

@ -2,7 +2,7 @@
e2d::FiniteTimeAction::FiniteTimeAction(double duration) e2d::FiniteTimeAction::FiniteTimeAction(double duration)
: _delta(0) : _delta(0)
, _duration(max(duration, 0)) , _duration(std::max(duration, 0.0))
{ {
} }
@ -28,7 +28,7 @@ void e2d::FiniteTimeAction::_update()
} }
else else
{ {
_delta = min((Time::getTotalTime() - _last) / _duration, 1); _delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0);
if (_delta >= 1) if (_delta >= 1)
{ {

View File

@ -62,13 +62,6 @@ bool e2d::Game::init()
throw SystemException(L"初始化 DirectInput 组件失败"); throw SystemException(L"初始化 DirectInput 组件失败");
} }
// 初始化路径
if (!Path::__init())
{
DestroyResources();
throw SystemException(L"必要系统路径访问失败");
}
// 初始化成功 // 初始化成功
_initialized = true; _initialized = true;

View File

@ -234,8 +234,8 @@ void e2d::Window::setSize(int width, int height)
// 当输入的窗口大小比分辨率大时,给出警告 // 当输入的窗口大小比分辨率大时,给出警告
WARN_IF(screenWidth < width || screenHeight < height, "The window is larger than screen!"); WARN_IF(screenWidth < width || screenHeight < height, "The window is larger than screen!");
// 取最小值 // 取最小值
width = min(width, screenWidth); width = std::min(width, screenWidth);
height = min(height, screenHeight); height = std::min(height, screenHeight);
// 修改窗口大小,并设置窗口在屏幕居中 // 修改窗口大小,并设置窗口在屏幕居中
::MoveWindow(_hWnd, (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE); ::MoveWindow(_hWnd, (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE);
} }

View File

@ -15,7 +15,7 @@ e2d::CircleCollider::CircleCollider(Point center, double radius)
e2d::CircleCollider::CircleCollider(Node * node) e2d::CircleCollider::CircleCollider(Node * node)
: _d2dCircle(nullptr) : _d2dCircle(nullptr)
{ {
double minSide = min(node->getRealWidth(), node->getRealHeight()); double minSide = std::min(node->getRealWidth(), node->getRealHeight());
this->setCircle( this->setCircle(
Point( Point(
node->getRealWidth() / 2, node->getRealWidth() / 2,
@ -50,7 +50,7 @@ void e2d::CircleCollider::_resize()
{ {
if (_parentNode && _enable) if (_parentNode && _enable)
{ {
double minSide = min(_parentNode->getRealWidth(), _parentNode->getRealHeight()); double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
this->setCircle( this->setCircle(
Point( Point(
_parentNode->getRealWidth() / 2, _parentNode->getRealWidth() / 2,

View File

@ -81,10 +81,10 @@ void e2d::Image::crop(const Rect& cropRect)
{ {
if (_bitmap) if (_bitmap)
{ {
_cropRect.origin.x = min(max(cropRect.origin.x, 0), this->getSourceWidth()); _cropRect.origin.x = std::min(std::max(cropRect.origin.x, 0.0), this->getSourceWidth());
_cropRect.origin.y = min(max(cropRect.origin.y, 0), this->getSourceHeight()); _cropRect.origin.y = std::min(std::max(cropRect.origin.y, 0.0), this->getSourceHeight());
_cropRect.size.width = min(max(cropRect.size.width, 0), this->getSourceWidth() - cropRect.origin.x); _cropRect.size.width = std::min(std::max(cropRect.size.width, 0.0), this->getSourceWidth() - cropRect.origin.x);
_cropRect.size.height = min(max(cropRect.size.height, 0), this->getSourceHeight() - cropRect.origin.y); _cropRect.size.height = std::min(std::max(cropRect.size.height, 0.0), this->getSourceHeight() - cropRect.origin.y);
} }
} }

View File

@ -476,7 +476,7 @@ void e2d::Node::setOpacity(double opacity)
if (_realOpacity == opacity) if (_realOpacity == opacity)
return; return;
_displayOpacity = _realOpacity = min(max(float(opacity), 0), 1); _displayOpacity = _realOpacity = std::min(std::max(float(opacity), 0.f), 1.f);
// 更新节点透明度 // 更新节点透明度
_updateOpacity(); _updateOpacity();
} }
@ -496,8 +496,8 @@ void e2d::Node::setPivot(double pivotX, double pivotY)
if (_pivotX == pivotX && _pivotY == pivotY) if (_pivotX == pivotX && _pivotY == pivotY)
return; return;
_pivotX = min(max(float(pivotX), 0), 1); _pivotX = std::min(std::max(float(pivotX), 0.f), 1.f);
_pivotY = min(max(float(pivotY), 0), 1); _pivotY = std::min(std::max(float(pivotY), 0.f), 1.f);
_needTransform = true; _needTransform = true;
} }
@ -913,8 +913,8 @@ void e2d::Node::setAutoUpdate(bool bAutoUpdate)
void e2d::Node::setDefaultPiovt(double defaultPiovtX, double defaultPiovtY) void e2d::Node::setDefaultPiovt(double defaultPiovtX, double defaultPiovtY)
{ {
s_fDefaultPiovtX = min(max(float(defaultPiovtX), 0), 1); s_fDefaultPiovtX = std::min(std::max(float(defaultPiovtX), 0.f), 1.f);
s_fDefaultPiovtY = min(max(float(defaultPiovtY), 0), 1); s_fDefaultPiovtY = std::min(std::max(float(defaultPiovtY), 0.f), 1.f);
} }
void e2d::Node::setDefaultCollider(Collider::Type type) void e2d::Node::setDefaultCollider(Collider::Type type)

View File

@ -92,8 +92,8 @@ void e2d::Sprite::crop(const Rect& cropRect)
{ {
_image->crop(cropRect); _image->crop(cropRect);
Node::setSize( Node::setSize(
min(max(cropRect.size.width, 0), _image->getSourceWidth() - _image->getCropX()), std::min(std::max(cropRect.size.width, 0.0), _image->getSourceWidth() - _image->getCropX()),
min(max(cropRect.size.height, 0), _image->getSourceHeight() - _image->getCropY()) std::min(std::max(cropRect.size.height, 0.0), _image->getSourceHeight() - _image->getCropY())
); );
} }

View File

@ -218,7 +218,7 @@ void e2d::Text::setWrappingWidth(double wrappingWidth)
{ {
if (_style.wrappingWidth != wrappingWidth) if (_style.wrappingWidth != wrappingWidth)
{ {
_style.wrappingWidth = max(wrappingWidth, 0); _style.wrappingWidth = std::max(wrappingWidth, 0.0);
if (_style.wrapping) if (_style.wrapping)
{ {

View File

@ -3,46 +3,46 @@
void e2d::Data::saveInt(const String& key, int value, const String& field) void e2d::Data::saveInt(const String& key, int value, const String& field)
{ {
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataSavePath()); ::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataPath());
} }
void e2d::Data::saveDouble(const String& key, double value, const String& field) void e2d::Data::saveDouble(const String& key, double value, const String& field)
{ {
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataSavePath()); ::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataPath());
} }
void e2d::Data::saveBool(const String& key, bool value, const String& field) void e2d::Data::saveBool(const String& key, bool value, const String& field)
{ {
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (value ? L"1" : L"0"), (LPCWSTR)Path::getDataSavePath()); ::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (value ? L"1" : L"0"), (LPCWSTR)Path::getDataPath());
} }
void e2d::Data::saveString(const String& key, const String& value, const String& field) void e2d::Data::saveString(const String& key, const String& value, const String& field)
{ {
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)value, (LPCWSTR)Path::getDataSavePath()); ::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)value, (LPCWSTR)Path::getDataPath());
} }
int e2d::Data::getInt(const String& key, int defaultValue, const String& field) int e2d::Data::getInt(const String& key, int defaultValue, const String& field)
{ {
return ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, defaultValue, (LPCWSTR)Path::getDataSavePath()); return ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, defaultValue, (LPCWSTR)Path::getDataPath());
} }
double e2d::Data::getDouble(const String& key, double defaultValue, const String& field) double e2d::Data::getDouble(const String& key, double defaultValue, const String& field)
{ {
wchar_t temp[32] = { 0 }; wchar_t temp[32] = { 0 };
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(defaultValue), temp, 31, (LPCWSTR)Path::getDataSavePath()); ::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(defaultValue), temp, 31, (LPCWSTR)Path::getDataPath());
return std::stof(temp); return std::stof(temp);
} }
bool e2d::Data::getBool(const String& key, bool defaultValue, const String& field) bool e2d::Data::getBool(const String& key, bool defaultValue, const String& field)
{ {
int nDefaultValue = defaultValue ? 1 : 0; int nDefaultValue = defaultValue ? 1 : 0;
int nValue = ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, nDefaultValue, (LPCWSTR)Path::getDataSavePath()); int nValue = ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, nDefaultValue, (LPCWSTR)Path::getDataPath());
return nValue != 0; return nValue != 0;
} }
e2d::String e2d::Data::getString(const String& key, const String& defaultValue, const String& field) e2d::String e2d::Data::getString(const String& key, const String& defaultValue, const String& field)
{ {
wchar_t temp[256] = { 0 }; wchar_t temp[256] = { 0 };
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)defaultValue, temp, 255, (LPCWSTR)Path::getDataSavePath()); ::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)defaultValue, temp, 255, (LPCWSTR)Path::getDataPath());
return temp; return temp;
} }

View File

@ -247,7 +247,7 @@ bool e2d::Music::play(int nLoopCount)
stop(); stop();
} }
nLoopCount = min(nLoopCount, XAUDIO2_LOOP_INFINITE - 1); nLoopCount = std::min(nLoopCount, XAUDIO2_LOOP_INFINITE - 1);
nLoopCount = (nLoopCount < 0) ? XAUDIO2_LOOP_INFINITE : nLoopCount; nLoopCount = (nLoopCount < 0) ? XAUDIO2_LOOP_INFINITE : nLoopCount;
// 提交 wave 样本数据 // 提交 wave 样本数据

View File

@ -1,70 +1,45 @@
#include "..\e2dtool.h" #include "..\e2dtool.h"
#include <algorithm> #include <algorithm>
#include <list>
#include <commdlg.h> #include <commdlg.h>
#define DEFINE_KNOWN_FOLDER(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2,{ b1, b2, b3, b4, b5, b6, b7, b8 } }
DEFINE_KNOWN_FOLDER(FOLDERID_LocalAppData, 0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91); extern "C" const GUID DECLSPEC_SELECTANY FOLDERID_LocalAppData = {
0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 }
};
static e2d::String s_sLocalAppDataPath; e2d::String e2d::Path::_tempPath;
static e2d::String s_sTempPath; e2d::String e2d::Path::_dataPath;
static e2d::String s_sDataSavePath; std::list<e2d::String> e2d::Path::_paths;
static std::list<e2d::String> s_vPathList;
bool e2d::Path::__init()
{
// 获取 AppData\Local 文件夹的路径
typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
PWSTR pszPath = nullptr;
HMODULE hModule = LoadLibrary(L"shell32.dll");
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule, "SHGetKnownFolderPath");
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr))
{
s_sLocalAppDataPath = pszPath;
CoTaskMemFree(pszPath);
}
else
{
WARN("Get local AppData path failed!");
return false;
}
return true;
}
void e2d::Path::setGameFolderName(const String & name) void e2d::Path::setGameFolderName(const String & name)
{ {
if (name.isEmpty()) if (name.isEmpty())
return; return;
// 获取数据的默认保存路径 // 设置数据的默认保存路径
if (!s_sLocalAppDataPath.isEmpty()) String localAppDataPath = Path::getLocalAppDataPath();
if (!localAppDataPath.isEmpty())
{ {
s_sDataSavePath = s_sLocalAppDataPath + L"\\Easy2DGameData\\" << name << L"\\"; _dataPath = localAppDataPath + L"\\Easy2DGameData\\" << name << L"\\";
if (!Path::exists(s_sDataSavePath) && !Path::createFolder(s_sDataSavePath)) if (!Path::exists(_dataPath) && !Path::createFolder(_dataPath))
{ {
s_sDataSavePath = L""; _dataPath = L"";
} }
s_sDataSavePath << L"Data.ini"; _dataPath << L"Data.ini";
} }
// 获取临时文件目录 // 设置临时文件保存路径
wchar_t path[_MAX_PATH]; wchar_t path[_MAX_PATH];
if (0 != ::GetTempPath(_MAX_PATH, path)) if (0 != ::GetTempPath(_MAX_PATH, path))
{ {
s_sTempPath << path << L"\\Easy2DGameTemp\\" << name << L"\\"; _tempPath << path << L"\\Easy2DGameTemp\\" << name << L"\\";
if (!Path::exists(s_sTempPath) && !Path::createFolder(s_sTempPath)) if (!Path::exists(_tempPath) && !Path::createFolder(_tempPath))
{ {
s_sTempPath = L""; _tempPath = L"";
} }
} }
} }
@ -76,19 +51,42 @@ void e2d::Path::addSearchPath(String path)
{ {
path << L"\\"; path << L"\\";
} }
auto iter = std::find(s_vPathList.cbegin(), s_vPathList.cend(), path); auto iter = std::find(_paths.cbegin(), _paths.cend(), path);
if (iter == s_vPathList.cend()) if (iter == _paths.cend())
{ {
s_vPathList.push_front(path); _paths.push_front(path);
} }
} }
e2d::String e2d::Path::getTempPath() e2d::String e2d::Path::getTempPath()
{ {
return s_sTempPath; return _tempPath;
} }
e2d::String e2d::Path::getExecutableFilePath() e2d::String e2d::Path::getLocalAppDataPath()
{
static String localAppDataPath;
if (localAppDataPath.isEmpty())
{
// 获取 AppData/Local 文件夹的路径
typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
PWSTR pszPath = nullptr;
HMODULE hModule = LoadLibrary(L"shell32.dll");
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule, "SHGetKnownFolderPath");
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr))
{
localAppDataPath = pszPath;
CoTaskMemFree(pszPath);
}
}
return localAppDataPath;
}
e2d::String e2d::Path::getCurrentFilePath()
{ {
TCHAR szPath[_MAX_PATH] = { 0 }; TCHAR szPath[_MAX_PATH] = { 0 };
if (::GetModuleFileName(nullptr, szPath, _MAX_PATH) != 0) if (::GetModuleFileName(nullptr, szPath, _MAX_PATH) != 0)
@ -106,7 +104,7 @@ e2d::String e2d::Path::findFile(const String& path)
} }
else else
{ {
for (auto& resPath : s_vPathList) for (auto& resPath : _paths)
{ {
if (Path::exists(resPath + path)) if (Path::exists(resPath + path))
{ {
@ -119,7 +117,7 @@ e2d::String e2d::Path::findFile(const String& path)
e2d::String e2d::Path::extractResource(int resNameId, const String & resType, const String & destFileName) e2d::String e2d::Path::extractResource(int resNameId, const String & resType, const String & destFileName)
{ {
String destFilePath = s_sTempPath + destFileName; String destFilePath = _tempPath + destFileName;
// ´´½¨Îļþ // ´´½¨Îļþ
HANDLE hFile = ::CreateFile((LPCWSTR)destFilePath, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL); HANDLE hFile = ::CreateFile((LPCWSTR)destFilePath, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
@ -146,9 +144,9 @@ e2d::String e2d::Path::extractResource(int resNameId, const String & resType, co
} }
} }
e2d::String e2d::Path::getDataSavePath() e2d::String e2d::Path::getDataPath()
{ {
return s_sDataSavePath; return _dataPath;
} }
e2d::String e2d::Path::getFileExtension(const String& filePath) e2d::String e2d::Path::getFileExtension(const String& filePath)

View File

@ -213,7 +213,7 @@ double e2d::Player::getVolume()
void e2d::Player::setVolume(double volume) void e2d::Player::setVolume(double volume)
{ {
_volume = min(max(float(volume), -224), 224); _volume = std::min(std::max(float(volume), -224.f), 224.f);
for (auto pair : _fileList) for (auto pair : _fileList)
{ {
pair.second->setVolume(_volume); pair.second->setVolume(_volume);

View File

@ -17,7 +17,7 @@ namespace e2d
, stopped(false) , stopped(false)
, runTimes(0) , runTimes(0)
, totalTimes(updateTimes) , totalTimes(updateTimes)
, delay(max(delay, 0)) , delay(std::max(delay, 0.0))
, lastTime(e2d::Time::getTotalTime()) , lastTime(e2d::Time::getTotalTime())
, callback(func) , callback(func)
, name(name) , name(name)

View File

@ -13,7 +13,7 @@ e2d::Transition::Transition(double duration)
, _outLayerParam() , _outLayerParam()
, _inLayerParam() , _inLayerParam()
{ {
_duration = max(duration, 0); _duration = std::max(duration, 0.0);
} }
e2d::Transition::~Transition() e2d::Transition::~Transition()
@ -68,7 +68,7 @@ void e2d::Transition::_update()
} }
else else
{ {
_delta = min((Time::getTotalTime() - _last) / _duration, 1); _delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0);
} }
this->_updateCustom(); this->_updateCustom();
@ -92,10 +92,10 @@ void e2d::Transition::_render()
{ {
Point rootPos = _outScene->getRoot()->getPos(); Point rootPos = _outScene->getRoot()->getPos();
auto clipRect = D2D1::RectF( auto clipRect = D2D1::RectF(
float(max(rootPos.x, 0)), float(std::max(rootPos.x, 0.0)),
float(max(rootPos.y, 0)), float(std::max(rootPos.y, 0.0)),
float(min(rootPos.x + _windowSize.width, _windowSize.width)), float(std::min(rootPos.x + _windowSize.width, _windowSize.width)),
float(min(rootPos.y + _windowSize.height, _windowSize.height)) float(std::min(rootPos.y + _windowSize.height, _windowSize.height))
); );
pRT->SetTransform(D2D1::Matrix3x2F::Identity()); pRT->SetTransform(D2D1::Matrix3x2F::Identity());
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
@ -111,10 +111,10 @@ void e2d::Transition::_render()
{ {
Point rootPos = _inScene->getRoot()->getPos(); Point rootPos = _inScene->getRoot()->getPos();
auto clipRect = D2D1::RectF( auto clipRect = D2D1::RectF(
float(max(rootPos.x, 0)), float(std::max(rootPos.x, 0.0)),
float(max(rootPos.y, 0)), float(std::max(rootPos.y, 0.0)),
float(min(rootPos.x + _windowSize.width, _windowSize.width)), float(std::min(rootPos.x + _windowSize.width, _windowSize.width)),
float(min(rootPos.y + _windowSize.height, _windowSize.height)) float(std::min(rootPos.y + _windowSize.height, _windowSize.height))
); );
pRT->SetTransform(D2D1::Matrix3x2F::Identity()); pRT->SetTransform(D2D1::Matrix3x2F::Identity());
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);

View File

@ -41,6 +41,7 @@
// C++ RunTime Header Files // C++ RunTime Header Files
#include <map> #include <map>
#include <set> #include <set>
#include <list>
#include <stack> #include <stack>
#include <vector> #include <vector>
#include <random> #include <random>
@ -97,3 +98,12 @@
Class(const Class &); \ Class(const Class &); \
Class & operator= (const Class &) Class & operator= (const Class &)
#endif #endif
#ifdef max
# undef max
#endif
#ifdef min
# undef min
#endif

View File

@ -477,13 +477,16 @@ public:
); );
// 获取数据的默认保存路径 // 获取数据的默认保存路径
static String getDataSavePath(); static String getDataPath();
// 获取临时文件目录 // 获取临时文件目录
static String getTempPath(); static String getTempPath();
// 获取执行程序的绝对路径 // 获取 LocalAppData 目录
static String getExecutableFilePath(); static String getLocalAppDataPath();
// 获取当前程序的运行路径
static String getCurrentFilePath();
// 获取文件扩展名 // 获取文件扩展名
static String getFileExtension( static String getFileExtension(
@ -507,8 +510,9 @@ public:
); );
private: private:
// 初始化 static String _tempPath;
static bool __init(); static String _dataPath;
static std::list<String> _paths;
}; };
} }