Lua腳本實(shí)現(xiàn)遞歸刪除一個(gè)文件夾
rmdir in quick-cocos2d-x with lua.
在使用 quick-cocos2d-x 做項(xiàng)目熱更新的時(shí)候,我需要建立臨時(shí)文件夾以保存下載的更新包。在更新完成后,我需要?jiǎng)h除這些臨時(shí)文件和文件夾。
cocos2d-x 和 quick-cocos2d-x 都沒(méi)有提供刪除文件夾功能。我做了如下2個(gè)嘗試:
1. 使用C++
在 cocos2d-x 2.x 中的 AssetsManager 包中提供了一個(gè) CreateDirectory 方法。這個(gè)方法可以跨平臺(tái)支持創(chuàng)建文件夾。在實(shí)際項(xiàng)目中運(yùn)行沒(méi)有問(wèn)題。
bool AssetsManager::createDirectory(const char *path)
{
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
mode_t processMask = umask(0);
int ret = mkdir(path, S_IRWXU | S_IRWXG | S_IRWXO);
umask(processMask);
if (ret != 0 && (errno != EEXIST))
{
return false;
}
return true;
#else
BOOL ret = CreateDirectoryA(path, NULL);
if (!ret && ERROR_ALREADY_EXISTS != GetLastError())
{
return false;
}
return true;
#endif
}
在 cocos2d-x 2.x 的 AssetsManager sample 范例中提供了一個(gè) reset 方法,這個(gè)方法使用系統(tǒng)命令遞歸刪除文件夾。
void UpdateLayer::reset(cocos2d::CCObject *pSender)
{
pProgressLabel->setString(" ");
// Remove downloaded files
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
string command = "rm -r ";
// Path may include space.
command += "\"" + pathToSave + "\"";
system(command.c_str());
#else
string command = "rd /s /q ";
// Path may include space.
command += "\"" + pathToSave + "\"";
system(command.c_str());
#endif
// Delete recorded version codes.
getAssetsManager()->deleteVersion();
createDownloadedDir();
}
但是,這個(gè) reset 在 ios 模擬器中運(yùn)行的時(shí)候,xcode會(huì)報(bào)這樣的warinng:
The iOS Simulator libSystem was initialized out of order. This is most often caused by running host executables or inserting host dylibs. In the future, this will cause an abort.
因此,我轉(zhuǎn)而考慮另一個(gè)方案。
2. 純lua
純 lua 其實(shí)是個(gè)噱頭。這里還是要依賴 lfs(lua file sytem),好在 quick-cocos2d-x 已經(jīng)包含了這個(gè)庫(kù)。
lfs.rmdir 命令 和 os.remove 命令一樣,只能刪除空文件夾。因此實(shí)現(xiàn)類似 rm -rf 的功能, 必須要遞歸刪除文件夾中所有的文件和子文件夾。
讓我們擴(kuò)展一下 os 包。
require("lfs")
function os.exists(path)
return CCFileUtils:sharedFileUtils():isFileExist(path)
end
function os.mkdir(path)
if not os.exists(path) then
return lfs.mkdir(path)
end
return true
end
function os.rmdir(path)
print("os.rmdir:", path)
if os.exists(path) then
local function _rmdir(path)
local iter, dir_obj = lfs.dir(path)
while true do
local dir = iter(dir_obj)
if dir == nil then break end
if dir ~= "." and dir ~= ".." then
local curDir = path..dir
local mode = lfs.attributes(curDir, "mode")
if mode == "directory" then
_rmdir(curDir.."/")
elseif mode == "file" then
os.remove(curDir)
end
end
end
local succ, des = os.remove(path)
if des then print(des) end
return succ
end
_rmdir(path)
end
return true
end
上面的代碼在 iOS 模擬器和 Android 真機(jī)上測(cè)試成功。Windows系統(tǒng)、Mac OSX 以及 iOS 真機(jī)還沒(méi)有測(cè)試。我測(cè)試后會(huì)立即更新。
相關(guān)文章
Golang使用ChatGPT生成單元測(cè)試實(shí)踐
這篇文章主要為大家介紹了Golang使用ChatGPT生成單元測(cè)試實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Lua中使用元表(metatable)執(zhí)行算術(shù)類元方法實(shí)例
這篇文章主要介紹了Lua中使用元表(metatable)執(zhí)行算術(shù)類元方法實(shí)例,本文給出了加法、減法、乘法、除法、相反數(shù)、取模等內(nèi)容,需要的朋友可以參考下2014-09-09Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹
這篇文章主要介紹了Lua教程(二):基礎(chǔ)知識(shí)、類型與值介紹,本文講解了Hello World程序、代碼規(guī)范、全局變量、類型與值等內(nèi)容,需要的朋友可以參考下2015-04-04Lua中的__index和__newindex實(shí)例
這篇文章主要介紹了Lua中的__index和__newindex實(shí)例,本文講解了具有默認(rèn)值的table、記錄table的訪問(wèn)、只讀的table等內(nèi)容,需要的朋友可以參考下2014-09-09