1.思路
读取指定路径文件夹,获取文件个数、名字、大小等信息。核心函数:_findfirst、_findnext和_fineclosestruct _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;}