Lua中实现递归删除一个文件夹_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 真机还没有测试。我测试后会立即更新。

时间: 2024-08-03 23:25:06

Lua中实现递归删除一个文件夹_Lua的相关文章

Lua脚本实现递归删除一个文件夹_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 方法.这个方法可以跨平台

删除一个文件夹目录里面含有很多文档的时候报错

今天同事在测试文件同步功能时,发现当删除一个文件夹目录,里面含有很多文档的时候就报: Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103) at org.apache.commons.dbc

php递归删除指定文件夹的方法小结

  php递归删除指定文件夹的方法:       下面为你介绍了php递归删除指定文件夹的方法,实例总结了两种常用的递归删除文件夹的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了两种php递归删除指定文件夹的方法.分享给大家供大家参考.具体如下: 方法一: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function recursiveDelete($dir) { if ($handle = @o

如何在win7系统中建立无法删除的文件夹?

  咱们的w764旗舰版系统下载电脑,除了用来办公处理文件,上网浏览网页,还有一些娱乐功能之外,咱们win7旗舰版电脑的基础功能还包含存放文件,这个功能也是咱们日常使用比较多的,但是对于win7旗舰版电脑中存放的文件,咱们自己可以删除,别人也是可以删除的,这对于用户来说,是不是一种危险的存在呢?其实,咱们还可以在win7旗舰版电脑中建立一些无法删除掉的文件夹,关于这个,大家知道该如何操作吗?如果不知道的话,不妨看看小编下面的介绍! 1.首先,咱们同时按下win7旗舰版电脑键盘上的win+R快捷键

定时删除一个文件夹内的所有子文件夹和文件的方法_DOS/BAT

在win9x的年代,用deltree这个外部命令就很容解决这个问题,不过从windows 2000 及windows xp之后,就取消了这个命令(真的是很奇怪),那么现在怎么解决呢?大家可能想到用 del+rd来解决这个问题.但有个问题,就是rd命令会删除您指定的目录.例如,当前目录结构如下: D:\>attrib /s /d d:\test\*.* A    R  I    D:\test\1.txt          此文件带有只读属性 A   H   I    D:\test\2.txt 

linux中shell脚本删除.svn文件夹

 当在linux服务器上进行了svn代码下载后,要同步到web目录里去的话,就要把.svn这个文件夹给清理干净,给安全性增加一点保障. 脚本内容: del_svn.sh  代码如下 复制代码 #!/bin/bash cd /home/trunk/ find ./ -name ".svn" |xargs -n1 echo > /dev/null 2>&1 find ./ -name ".svn" -print0 | xargs -0 rm -fr

C#删除多重文件夹

一个根文件夹,底下包含多级目录,每一级又存在多个个子文件夹,每个文件夹里面又存在多个文件. 如果要删除所有子文件又保存最顶级的目录文件夹,那采用什么办法处理好呢? 处理方法 1. 直接删除根文件夹,然后再创建根文件夹. void deleteAllFile(string path) { Directory.Delete(path,true); Directory.CreateDirectory(path); } 2.遍历所有子目录文件夹的文件,逐个删除. ///   /// 遍历文件夹及子文件夹

Shell脚本实现递归删除空文件夹_linux shell

有时我们需要递归删除空文件夹,网上找了一下,没有发现比较好的Shell脚本,于是自己动手写了一个 脚本 复制代码 代码如下: #!/bin/bash # author: 十年后的卢哥哥 # des: delete empty directories recursive deleteempty() {   find ${1:-.} -mindepth 1 -maxdepth 1 -type d | while read -r dir   do     if [[ -z "$(find "

用C语言实现统计一个文件夹中各种文件的比例

原文:用C语言实现统计一个文件夹中各种文件的比例 <UNIX环境高级编程>中的程序清单4-7就介绍了如何实现递归地统计某个目录下面的文件!我刚开始看过它的代码后,觉得照着敲太没意思了,所以就合上书自己写了一遍!为此还写了一篇博文,这是博文地址:在linux下用C语言实现递归查看某个目录中的所有文件[CSDN]! 今天做<Unix环境高级编程>的课后题,看到题目4.11这里提供了一种新的实现这个程序的思路,那就是每回读到一个目录,就通过chdir函数进入到这个目录,然后再通过open