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

 更新时间:2015年05月27日 09:27:41   投稿:junjie  
这篇文章主要介绍了Lua脚本实现递归删除一个文件夹,本文给出了C++和Lua两个版本的实现代码,需要的朋友可以参考下

复制代码 代码如下:

rmdir in quick-cocos2d-x with 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中算术运算符的使用示例

    这篇文章主要介绍了Lua中算术运算符的使用示例,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua判断Table是否为空的方法(空的table即{})

    Lua判断Table是否为空的方法(空的table即{})

    这篇文章主要介绍了Lua判断Table是否为空的方法(空的table即{}),如何判断lua中的table是否是空的table呢,本文就试验了多个方法,最后得出比较好的判断方法,需要的朋友可以参考下
    2015-04-04
  • Lua中的函数知识总结

    Lua中的函数知识总结

    这篇文章主要介绍了Lua中的函数知识总结,本文讲解了函数的一些基础知识、多重返回值问题、变长参数、内嵌函数等内容,需要的朋友可以参考下
    2014-09-09
  • Lua读写文件代码示例

    Lua读写文件代码示例

    这篇文章主要介绍了Lua读写文件代码示例,本文讲解了读写文件的模式以及读写文件代码实例,需要的朋友可以参考下
    2015-04-04
  • Golang使用ChatGPT生成单元测试实践

    Golang使用ChatGPT生成单元测试实践

    这篇文章主要为大家介绍了Golang使用ChatGPT生成单元测试实践详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • lua调用C/C++的方法详解

    lua调用C/C++的方法详解

    lua是脚本语言,优点是门槛低,可以热更新,缺点当然就是性能,C/C++是编译型语言,有点是性能高,但是相对的,门槛高,lua语言本身就是用C实现的,而且,可以将很多能力封装成lua的接口供lua调用,本文将给大家介绍lua如何调用C/C++,需要的朋友可以参考下
    2023-10-10
  • Lua中使用元表(metatable)执行算术类元方法实例

    Lua中使用元表(metatable)执行算术类元方法实例

    这篇文章主要介绍了Lua中使用元表(metatable)执行算术类元方法实例,本文给出了加法、减法、乘法、除法、相反数、取模等内容,需要的朋友可以参考下
    2014-09-09
  • Lua中string.lower()使用指南

    Lua中string.lower()使用指南

    这篇文章主要介绍了Lua中操作字符串的基本方法整理,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2016-08-08
  • Lua教程(二):基础知识、类型与值介绍

    Lua教程(二):基础知识、类型与值介绍

    这篇文章主要介绍了Lua教程(二):基础知识、类型与值介绍,本文讲解了Hello World程序、代码规范、全局变量、类型与值等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中的__index和__newindex实例

    Lua中的__index和__newindex实例

    这篇文章主要介绍了Lua中的__index和__newindex实例,本文讲解了具有默认值的table、记录table的访问、只读的table等内容,需要的朋友可以参考下
    2014-09-09

最新评论