Cocos2.2.3文件夹的创建与递归删除

这篇博客详细介绍了在Cocos2d-x环境下,如何在win32和Android平台上实现文件夹的创建以及递归删除。提供了对应的C++代码实现,包括创建目录、删除目录、判断文件夹以及递归删除文件夹的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍了win32、android下文件夹的创建以及递归删除,下述代码都可直接在Cocos中调用

头文件:
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h> 
#include <stdio.h>
#include <dirent.h>
#endif

代码:
//Android or win32 创建文件夹
bool DLManager::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))
	{
		CCLog("mkdir failed...");
		return false;
	}

	return true;
#else
	BOOL ret = CreateDirectoryA(path, NULL);
	if (!ret && ERROR_ALREADY_EXISTS != GetLastError())
	{
		return false;
	}
	return true;
#endif
}

//Android or win32 递归删除文件夹
bool DLManager::deleteDirectory(const char * path)
{
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
	DeleteDirectory(path);
#else	
	return DeleteDirectoryWin32(path);	
#endif
}

//Android 下判断是否为文件夹————引用自http://blog.youkuaiyun.com/honty/article/details/7822923
int DLManager::IsDirectory(const char * filename)  
{  
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)

	struct stat buf;  
	int ret = stat(filename,&buf);  
	if(0 == ret)  
	{  
		if(buf.st_mode & S_IFDIR)  
		{  
			//printf("%s is folder\n",filename);  
			return 0;  
		}  
		else  
		{  
			//printf("%s is file\n",filename);  
			return 1;  
		}  
	}  
	return -1;  

#endif

	return -1;
}  

//Android 下递归删除文件夹————引用自http://blog.youkuaiyun.com/honty/article/details/7822923
int DLManager::DeleteDirectory(const char * dirname)  
{  
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)

	char chBuf[256];  
	DIR * dir = NULL;  
	struct dirent *ptr;  
	int ret = 0;  
	dir = opendir(dirname);  
	if(NULL == dir)  
	{  
		return -1;  
	}  
	while((ptr = readdir(dir)) != NULL)  
	{  
		ret = strcmp(ptr->d_name, ".");  
		if(0 == ret)  
		{  
			continue;  
		}  
		ret = strcmp(ptr->d_name, "..");  
		if(0 == ret)  
		{  
			continue;  
		}  
		snprintf(chBuf, 256, "%s/%s", dirname, ptr->d_name);  
		ret = IsDirectory(chBuf);  
		if(0 == ret)  
		{  
			//printf("%s is dir\n", chBuf);  
			ret = DeleteDirectory(chBuf);  
			if(0 != ret)  
			{  
				return -1;  
			}  
		}  
		else if(1 == ret)  
		{  
			//printf("%s is file\n", chBuf);  
			ret = remove(chBuf);  
			if(0 != ret)  
			{  
				return -1;  
			}  
		}  
	}  
	(void)closedir(dir);  

	ret = remove(dirname);  
	if(0 != ret)  
	{  
		return -1;  
	}  
	return 0;  

#endif

	return -1;
}  

//win32 下判断是否为文件夹————引用自http://blog.youkuaiyun.com/jaff20071234/article/details/6559533
bool DLManager::IsDirectoryWin32(const char *pDir)  
{ 
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

    char szCurPath[500];  
    ZeroMemory(szCurPath, 500);  
    sprintf_s(szCurPath, 500, "%s//*", pDir);  
    WIN32_FIND_DATAA FindFileData;        
    ZeroMemory(&FindFileData, sizeof(WIN32_FIND_DATAA));  
  
    HANDLE hFile = FindFirstFileA(szCurPath, &FindFileData); /**< find first file by given path. */  
  
    if( hFile == INVALID_HANDLE_VALUE )   
    {  
        FindClose(hFile);  
        return FALSE; /** 如果不能找到第一个文件,那么没有目录 */  
    }else  
    {     
        FindClose(hFile);  
        return TRUE;  
    }  

#endif

	return false;
}  

//win32 下递归删除文件夹————引用自http://blog.youkuaiyun.com/jaff20071234/article/details/6559533  
bool DLManager::DeleteDirectoryWin32(const char * DirName)  
{  
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

//http://blog.youkuaiyun.com/jaff20071234/article/details/6559533
//  CFileFind tempFind;     //声明一个CFileFind类变量,以用来搜索  
    char szCurPath[MAX_PATH];       //用于定义搜索格式  
    _snprintf(szCurPath, MAX_PATH, "%s//*.*", DirName); //匹配格式为*.*,即该目录下的所有文件  
    WIN32_FIND_DATAA FindFileData;        
    ZeroMemory(&FindFileData, sizeof(WIN32_FIND_DATAA));  
    HANDLE hFile = FindFirstFileA(szCurPath, &FindFileData);  
    BOOL IsFinded = TRUE;  
    while(IsFinded)  
    {  
        IsFinded = FindNextFileA(hFile, &FindFileData); //递归搜索其他的文件  
        if( strcmp(FindFileData.cFileName, ".") && strcmp(FindFileData.cFileName, "..") ) //如果不是"." ".."目录  
        {  
            string strFileName = "";  
            strFileName = strFileName + DirName + "//" + FindFileData.cFileName;  
            string strTemp;  
            strTemp = strFileName;  
            if( IsDirectoryWin32(strFileName.c_str()) ) //如果是目录,则递归地调用  
            {     
                printf("目录为:%s/n", strFileName.c_str());  
                DeleteDirectoryWin32(strTemp.c_str());  
            }  
            else  
            {  
                DeleteFileA(strTemp.c_str());  
            }  
        }  
    }  
    FindClose(hFile);  
  
    BOOL bRet = RemoveDirectoryA(DirName);  
    if( bRet == 0 ) //删除目录  
    {  
        printf("删除%s目录失败!/n", DirName);  
        return FALSE;  
    }  
    return TRUE;  

#endif

	return false;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值