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

来源:互联网 发布:tensorflow mnist 例子 编辑:程序博客网 时间:2024/05/17 07:28

我们做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;}
1 0
原创粉丝点击