Lua中实现递归删除一个文件夹

 更新时间:2015年01月13日 09:08:15   投稿:junjie  
这篇文章主要介绍了Lua中实现递归删除一个文件夹,本文给出了使用C++和使用纯LUA两种方式实现,需要的朋友可以参考下

在使用 quick-cocos2d-x 做项目热更新的时候,我需要建立临时文件夹以保存下载的更新包。在更新完成后,我需要删除这些临时文件和文件夹。

cocos2d-x 和 quick-cocos2d-x 都没有提供删除文件夹功能。我做了如下2个尝试:

1. 使用C++

在 cocos2d-x 2.x 中的 AssetsManager 包中提供了一个 CreateDirectory 方法。这个方法可以跨平台支持创建文件夹。在实际项目中运行没有问题。

复制代码 代码如下:

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 方法,这个方法使用系统命令递归删除文件夹。
复制代码 代码如下:

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 模拟器中运行的时候,xcode会报这样的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.

因此,我转而考虑另一个方案。

2. 纯lua

纯 lua 其实是个噱头。这里还是要依赖 lfs(lua file sytem),好在 quick-cocos2d-x 已经包含了这个库。

lfs.rmdir 命令 和 os.remove 命令一样,只能删除空文件夹。因此实现类似 rm -rf 的功能, 必须要递归删除文件夹中所有的文件和子文件夹。

让我们扩展一下 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 真机上测试成功。Windows系统、Mac OSX 以及 iOS 真机还没有测试。我测试后会立即更新。

相关文章

  • 分析Lua观察者模式最佳实践之构建事件分发系统

    分析Lua观察者模式最佳实践之构建事件分发系统

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式
    2021-06-06
  • Lua中实现递归删除一个文件夹

    Lua中实现递归删除一个文件夹

    这篇文章主要介绍了Lua中实现递归删除一个文件夹,本文给出了使用C++和使用纯LUA两种方式实现,需要的朋友可以参考下
    2015-01-01
  • C++遍历Lua table的方法实例

    C++遍历Lua table的方法实例

    这篇文章主要介绍了C++遍历Lua table的方法实例,本文给出了Lua table数据格式、C++实现的遍历代码以及输出效果,需要的朋友可以参考下
    2015-04-04
  • Lua中os库详细介绍

    Lua中os库详细介绍

    这篇文章主要介绍了Lua中os库详细介绍,本文详细讲解了OS库中的常用方法,分别对参数做出了解释,有的给出了示例,需要的朋友可以参考下
    2014-11-11
  • Lua字符串库(string库)学习笔记

    Lua字符串库(string库)学习笔记

    这篇文章主要介绍了Lua字符串库(string库)学习笔记,本文列举了一些常用的Lua字符串库函数,如byte、char、dump、find等,需要的朋友可以参考下
    2014-12-12
  • Lua中的闭包学习笔记

    Lua中的闭包学习笔记

    这篇文章主要介绍了Lua中的闭包学习笔记,闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量),需要的朋友可以参考下
    2014-12-12
  • Lua 学习笔记之C API 遍历 Table实现代码

    Lua 学习笔记之C API 遍历 Table实现代码

    这篇文章主要介绍了Lua 学习笔记之C API 遍历 Table实现代码,需要的朋友可以参考下
    2014-12-12
  • Lua中操作字符串的基本方法整理

    Lua中操作字符串的基本方法整理

    这篇文章主要介绍了Lua中操作字符串的基本方法整理,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua读取和写入文件处理例子

    Lua读取和写入文件处理例子

    这篇文章主要介绍了Lua读取和写入文件处理,本文直接给出实例代码,需要的朋友可以参考下
    2014-11-11
  • Lua中的迭代器和泛型for介绍

    Lua中的迭代器和泛型for介绍

    这篇文章主要介绍了Lua中的迭代器和泛型for介绍,任何一种结构,只要允许你遍历集合中所有元素的都可称之为迭代器,本文就讲解了Lua中迭代器的相关知识和代码实例,并讲解了泛型for的语法,需要的朋友可以参考下
    2015-04-04

最新评论