在Lua中递归删除一个文件夹

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


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


1. 使用 C++

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 方法,这个方法使用系统命令递归删除文件夹。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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 OS X 以及 iOS 真机还没有测试。我测试后会立即更新。


本文已在CocoaChina论坛Quick-Cocos2d-x讨论区发帖,欢迎大家加入讨论!


推荐阅读:

在Quick-Cocos2d-x中嵌入浏览器

来源网址:http://zengrong.net/post/2129.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值