国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Lua中實(shí)現(xiàn)遞歸刪除一個文件夾

2024-07-21 23:04:23
字體:
供稿:網(wǎng)友

在使用 quick-cocos2d-x 做項(xiàng)目熱更新的時候,我需要建立臨時文件夾以保存下載的更新包。在更新完成后,我需要刪除這些臨時文件和文件夾。

cocos2d-x 和 quick-cocos2d-x 都沒有提供刪除文件夾功能。我做了如下2個嘗試:

1. 使用C++

在 cocos2d-x 2.x 中的 AssetsManager 包中提供了一個 CreateDirectory 方法。這個方法可以跨平臺支持創(chuàng)建文件夾。在實(shí)際項(xiàng)目中運(yùn)行沒有問題。

 

復(fù)制代碼 代碼如下:

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 范例中提供了一個 reset 方法,這個方法使用系統(tǒng)命令遞歸刪除文件夾。
復(fù)制代碼 代碼如下:

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();
}


但是,這個 reset 在 ios 模擬器中運(yùn)行的時候,xcode會報(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)而考慮另一個方案。

2. 純lua

純 lua 其實(shí)是個噱頭。這里還是要依賴 lfs(lua file sytem),好在 quick-cocos2d-x 已經(jīng)包含了這個庫。

lfs.rmdir 命令 和 os.remove 命令一樣,只能刪除空文件夾。因此實(shí)現(xiàn)類似 rm -rf 的功能, 必須要遞歸刪除文件夾中所有的文件和子文件夾。

讓我們擴(kuò)展一下 os 包。

復(fù)制代碼 代碼如下:

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ī)上測試成功。Windows系統(tǒng)、Mac OSX 以及 iOS 真機(jī)還沒有測試。我測試后會立即更新。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泾川县| 济阳县| 澎湖县| 邵东县| 西丰县| 哈密市| 澜沧| 黑河市| 广河县| 黎城县| 高要市| 玛沁县| 遵义市| 耿马| 安塞县| 德阳市| 长武县| 县级市| 卫辉市| 北川| 湖南省| 教育| 新乡市| 汝城县| 虹口区| 麦盖提县| 虞城县| 竹北市| 定襄县| 石首市| 通江县| 板桥市| 来凤县| 婺源县| 乌海市| 游戏| 河源市| 米林县| 长子县| 囊谦县| 噶尔县|