1.思路
- 读取指定路径文件夹,获取文件个数、名字、大小等信息。核心函数:_findfirst、_findnext和_fineclose
struct _finddata_t {
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[260];
};
time_t:其实就是long _fsize_t:就是unsigned long attrib就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。 time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。 size:文件大小 name:文件名
_findfirst函数:long _findfirst(const char * , struct _finddata_t ); 第一个参数为文件名,可以用".“来查找所有文件,也可以用”*.cpp"来查找.cpp文件。第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。 _findnext函数:int _findnext(long, struct _finddata_t *); 第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。此函数可与_findfirst函数配合,找到指定路径下的所有文件 _findclose()函数:int _findclose(long); 只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。 三个函数一起实现文件夹的读取,可以获取文件夹的名字、大小、时间等信息
- 删除文件夹,核心函数:SHFileOperation
int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);
typedef struct _SHFILEOPSTRUCT {
HWND hwnd;//指向发送消息的窗口
UINT wFunc;//执行的操作
LPCTSTR pFrom;//源文件名
LPCTSTR pTo;//目标文件名
FILEOP_FLAGS fFlags;//操作与确认标识
BOOL fAnyOperationsAborted;//操作是否终止
LPVOID hNameMappings;//文件映射
LPCTSTR lpszProgressTitle;//进度条标题
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
2.代码实现,文件夹读取删除
hFile为long型,但运行报错,这里使用intptr_t,可以正常运行
getJustCurrentFile(CString CSpath, vector<string>& files)
{
/*CSpath = CSpath.Left(CSpath.GetLength() - 13);
string path = CStringA(CSpath);*/
string path = "E:\\缺陷检测图片\\";
//文件句柄
intptr_t hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("*").c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//attrib属性为_A_SUBDIR读取文件夹
{
if ((strcmp(fileinfo.name, ".") != 0) && (strcmp(fileinfo.name, "..") != 0))//读取文件路径时附带\\.和\\..两个文件,这里做下排除
{
files.push_back(path + fileinfo.name);
}
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
删除文件夹及子文件,删除文件的一些参数这里不作描述,可根据需求自行实现,这里只介绍框架
BOOL DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPath;
FileOp.pTo = NULL;
FileOp.wFunc = FO_DELETE;
return SHFileOperation(&FileOp) == 0;
}
|