您的位置:首页 > 其它

windows客户端开发--判断一个文件夹中是否存在文件夹

2016-04-05 22:02 309 查看
我们做windows客户端,往往需要与文件夹打交道。

比如说某些特定的情况下,我们需要删除某个文件夹的子文件夹的全部内容。有时候程序执行的比较慢,我们需要判断到底是否删除了文件夹下的子文件夹呢?

换种思维,如果我们能计算出某个文件下下有多少个子文件夹呢?

FindFirstFile

函数功能描述:查找指定目录的第一个文件或目录并返回它的句柄

HANDLE FindFirstFile(
LPCTSTR lpFileName,                       // 目录名
LPWIN32_FIND_DATA lpFindFileData   // 数据缓冲区
);


参数:

lpFileName

[输入] 指向字符串的指针用于指定一个有效的目录。

lpFindFileData

[输出] 指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。

返回值:

如果成功,则返回找到文件或目录的句柄。在FindNextFile和FindClose函数中会用到此句柄。

如果失败,返回INVALID_HANDLE_VALUE。要获得更多的信息调用GetLastError函数。

_WIN32_FIND_DATA

typedef struct _WIN32_FIND_DATA

{

DWORD dwFileAttributes; // 文件属性

FILETIME ftCreationTime; // 文件创建时间

FILETIME ftLastAccessTime; // 文件最后一次访问时间

FILETIME ftLastWriteTime; // 文件最后一次修改时间

DWORD nFileSizeHigh; // 文件长度高32位

DWORD nFileSizeLow; // 文件长度低32位

DWORD dwReserved0; // 系统保留

DWORD dwReserved1; // 系统保留

TCHAR cFileName[ MAX_PATH ]; // 长文件名

TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

}WIN32_FIND_DATA, *PWIN32_FIND_DATA;

FindNextFile

判断当前目录下是否有下一个目录或文件

有了上面的基础,我们就可以写出代码了,计算指定路径下文件夹的个数。

等等,如果判断文件还是文件夹呢?

FILE_ATTRIBUTE_DIRECTORY

这个时候就可以写出完整的了:

int CountTotalFoldersInDirectory(std::wstring& path)
{
size_t len = _tcslen(path.c_str());
const size_t alloc_len = len + 3;
TCHAR* sub_wild = new TCHAR[alloc_len];
_tcscpy_s(sub_wild, alloc_len, path.c_str());
if (len && sub_wild[len - 1] != _T('\\')) { sub_wild[len++] = _T('\\'); }
sub_wild[len++] = _T('*');
sub_wild[len++] = _T('\0');

// File enumeration starts here
WIN32_FIND_DATA fd;
HANDLE hfind;
int count = 0;
if (INVALID_HANDLE_VALUE != (hfind = FindFirstFile(sub_wild, &fd))) {
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
// is_alias_dir is true if directory name is "." or ".."
const bool is_alias_dir = fd.cFileName[0] == _T('.') &&
(!fd.cFileName[1] || (fd.cFileName[1] == _T('.') &&
!fd.cFileName[2]));

count += !is_alias_dir;
}
} while (FindNextFile(hfind, &fd));
FindClose(hfind);
}

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