您的位置:首页 > 其它

封装删除文件夹及文件类(包括删除指定文件夹及按过快期时间删除文件及文件夹)

2010-12-24 13:17 369 查看
删除文件夹及其所包含的所有子文件:

1.遍历指定文件夹下所有的文件,按递归方法删除子文件及文件夹。

2.删除过期文件,则是在1思路上去比对过期时间与文件修改时间,如果文件修改时间在过期时间之前,则删除.

头文件FileOperator.h :

#ifndef __FILE_OPERATOR_H
#define __FILE_OPERATOR_H
//////////////////////////////////////////////////////////////////////////
#include <windows.h>
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
class CFileOperator
{
public:
CFileOperator();
virtual ~CFileOperator();

BOOL RemoveFileByDate(const char* pszDir, struct tm& tmRemove);  		//按时间删除过期文件

BOOL ExitDirectory(const char* pszDir);                             //判断文件夹是否存在
BOOL RemoveFilesInDirectory( const char* pszDirectory );						//删除指定文件夹下所有文件
BOOL RemoveOnlyDirectory( const char* pszDirectory );								//删除空文件夹
BOOL RemoveFile(const char* pszDirName, const char* pszFileName);   //删除单个文件
protected:
void SystemTimeTotm(SYSTEMTIME& sysTime, struct tm& tmTime);        //时间转换
BOOL IsBeforRemoveData(struct tm& tmFile, struct tm& tmRemove);     //时间比较

private:
};
//////////////////////////////////////////////////////////////////////////
#endif//__FILE_OPERATOR_H


源文件FileOperator.c :

#include <stdio.h>
#include <time.h>
#include "FileOperator.h"

//////////////////////////////////////////////////////////////////////////

CFileOperator::CFileOperator()
{

}

CFileOperator::~CFileOperator()
{
}

//判断文件夹是否存在
BOOL CFileOperator::ExitDirectory(const char* pszDir)
{
DWORD dwRet = GetFileAttributes(pszDir);

if ( dwRet == 0xFFFFFFFF )
return FALSE;

return ( FILE_ATTRIBUTE_DIRECTORY & GetFileAttributes(pszDir) );
}

//按时间删除过期文件,先逐个删除文件下所有的子文件后再删除空文件夹
BOOL CFileOperator::RemoveFileByDate(const char* pszDirectory, struct tm& tmRemove)
{
char szDelFilePath[MAX_PATH];
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
SYSTEMTIME FileModifyTime;
struct tm  tmFileModify;

memset(&FileModifyTime, 0, sizeof(FileModifyTime));
memset(&tmFileModify, 0, sizeof(tmFileModify));

strcpy(szFind,pszDirectory);
strcat(szFind,"//*.*");

HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return 0;

while(1)
{
::SetFileAttributes( FindFileData.cFileName,FindFileData.dwFileAttributes & (~FILE_ATTRIBUTE_READONLY) );
FileTimeToSystemTime( &FindFileData.ftLastWriteTime, &FileModifyTime );
SystemTimeTotm( FileModifyTime, tmFileModify );

if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{//如果是文件夹,直接跳过
if( ( stricmp( FindFileData.cFileName,	"." ) !=0 ) &&
( stricmp( FindFileData.cFileName,	".." ) !=0 ) )
{
if ( IsBeforRemoveData(tmFileModify, tmRemove) )
{//要删除的过期文件夹
sprintf(szDelFilePath,"%s//%s",pszDirectory,FindFileData.cFileName);
RemoveFileByDate(szDelFilePath, tmRemove);
RemoveOnlyDirectory(szDelFilePath);
}
}
}
else
{
if ( IsBeforRemoveData(tmFileModify, tmRemove) )
{//要删除的过期文件
RemoveFile(pszDirectory, FindFileData.cFileName);
}
}

if(!FindNextFile(hFind,&FindFileData))
break;
}

FindClose(hFind);
//	RemoveOnlyDirectory(pszDirectory);

return TRUE;
}

//删除指定文件夹下所有文件
BOOL CFileOperator::RemoveFilesInDirectory( const char* pszDirectory)
{
char szDelFilePath[MAX_PATH];
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;

strcpy(szFind,pszDirectory);
strcat(szFind,"//*.*");

HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
return 0;

while(1)
{
::SetFileAttributes( FindFileData.cFileName,FindFileData.dwFileAttributes & (~FILE_ATTRIBUTE_READONLY) );

if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{//如果是文件夹,直接跳过
if( ( stricmp( FindFileData.cFileName,	"." ) !=0 ) &&
( stricmp( FindFileData.cFileName,	".." ) !=0 ) )
{
sprintf(szDelFilePath,"%s//%s",pszDirectory,FindFileData.cFileName);
RemoveFilesInDirectory(szDelFilePath);
RemoveOnlyDirectory(szDelFilePath);
}
}
else
{
RemoveFile(pszDirectory, FindFileData.cFileName);
}

if(!FindNextFile(hFind,&FindFileData))
break;
}

FindClose(hFind);
//	RemoveOnlyDirectory(pszDirectory);

return TRUE;
}

//删除空文件夹
BOOL CFileOperator::RemoveOnlyDirectory( const char* pszDirectory )
{
::SetFileAttributes( pszDirectory,FILE_ATTRIBUTE_ARCHIVE );
if ( !::RemoveDirectory(pszDirectory) )
{
DWORD dwErr = GetLastError();
return FALSE;
}

return TRUE;
}

//删除单个文件
BOOL CFileOperator::RemoveFile(const char* pszDirName, const char* pszFileName)
{
char szFilePath[256] = "";

sprintf(szFilePath, "%s//%s", pszDirName,pszFileName);
::SetFileAttributes( szFilePath, FILE_ATTRIBUTE_ARCHIVE );

return ::DeleteFile(szFilePath);
}

////时间转换
void CFileOperator::SystemTimeTotm(SYSTEMTIME& sysTime, struct tm& tmTime)
{
tmTime.tm_year = sysTime.wYear - 1900;
tmTime.tm_mon = sysTime.wMonth - 1;
tmTime.tm_mday = sysTime.wDay;
tmTime.tm_hour = sysTime.wHour;
tmTime.tm_min = sysTime.wMinute;
tmTime.tm_sec = sysTime.wSecond;
tmTime.tm_wday = sysTime.wDayOfWeek;
}

//时间比较
BOOL CFileOperator::IsBeforRemoveData(struct tm& tmFile, struct tm& tmRemove)
{
if ( tmFile.tm_year < tmRemove.tm_year )
return TRUE;

if ( tmFile.tm_mon < tmRemove.tm_mon )
return TRUE;

if ( tmFile.tm_mday < tmRemove.tm_mday )
return TRUE;

if ( tmFile.tm_hour < tmRemove.tm_hour )
return TRUE;

if ( tmFile.tm_min < tmRemove.tm_min )
return TRUE;

if ( tmFile.tm_sec < tmRemove.tm_sec )
return TRUE;

return FALSE;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: