除虫记——有关WindowsAPI文件查找函数的一次压力测试
作者:朱金灿
来源:http://blog.csdn.net/clever101
这里说的除虫是指排除bug的意思。今天排除了一个有意思的bug,其中的场景大致是这样的:现在你要统计一个文件夹下非隐藏文件的数目(包含它的子文件夹),很快你写出这样的代码:
//dirName ——文件夹路径
//nImgNum ——文件数量
bool StatFiles(std::string& dirName,int& nImgNum)
{
std::string tempFileFind = dirName + _T("\\*") ; HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA ffd;
hFind = FindFirstFile(tempFileFind.c_str(), &ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
tString strSub = dirName + _T("\\") + ffd.cFileName;
if (((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0)
&&((ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)==0))
{
nImgNum++;
}
}while (FindNextFile(hFind, &ffd) != 0);
}
else
{
return false;
} tempFileFind = dirName + _T("\\*");
hFind = INVALID_HANDLE_VALUE; hFind = FindFirstFile(tempFileFind.c_str(), &ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if (ffd.cFileName[0] == '.')
{
if (ffd.cFileName[1] == '\0' ||
(ffd.cFileName[1] == '.' &&
ffd.cFileName[2] == '\0'))
{
continue;
}
} std::string strSub = dirName + _T("\\") + ffd.cFileName;
if (!((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0))
{
StatFiles(strSub,nImgNum);
} }while (FindNextFile(hFind, &ffd) != 0);
} return true;
}
然后拿一个文件夹来测试,嗯,测试没有问题,返回的数目也是对的。然后我们拿一个包含很多子文件夹和文件来测试,发现运行到文件数是七千多的时候函数就返回false了。开始我们比较迷惑,后来发现问题了,原来是忘记关闭文件查找句柄了,当统计达到七千多的时候已经把windows的查找句柄资源消耗尽了。我感觉这真是对WindowsAPI文件查找函数的一次压力测试。正确的代码应该是这样的:
//dirName ——文件夹路径
//nImgNum ——文件数量
bool StatFiles(std::string& dirName,int& nImgNum)
{
std::string tempFileFind = dirName + _T("\\*") ; HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA ffd;
hFind = FindFirstFile(tempFileFind.c_str(), &ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
tString strSub = dirName + _T("\\") + ffd.cFileName;
if (((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0)
&&((ffd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)==0))
{
nImgNum++;
}
}while (FindNextFile(hFind, &ffd) != 0);
}
else
{
return false;
}
FindClose(hFind); //记得关闭文件查找句柄 tempFileFind = dirName + _T("\\*");
hFind = INVALID_HANDLE_VALUE; hFind = FindFirstFile(tempFileFind.c_str(), &ffd);
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
if (ffd.cFileName[0] == '.')
{
if (ffd.cFileName[1] == '\0' ||
(ffd.cFileName[1] == '.' &&
ffd.cFileName[2] == '\0'))
{
continue;
}
} std::string strSub = dirName + _T("\\") + ffd.cFileName;
if (!((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0))
{
StatFiles(strSub,nImgNum);
} }while (FindNextFile(hFind, &ffd) != 0);
}
FindClose(hFind); //记得关闭文件查找句柄 return true;
}
如何避免这种资源泄漏的问题的发生?首先需要明确你要申请的是一种资源,在使用资源之前需要明确在哪儿释放掉资源从而避免资源泄漏。
除虫记——有关WindowsAPI文件查找函数的一次压力测试的更多相关文章
- 除虫记之C#调用C函数出现的诡异错误
作者:朱金灿 来源:http://blog.csdn.net/clever101 同事反映在在项目中使用C#程序调用我们部门编写的C++模块出现一个诡异错误:在调用A算法失败后,其它算法均不能调 ...
- 记在VMware虚拟机中对网站进行性能压力测试的经历
由于本次测试,仅仅是对静态网站首页进行的测试,所以没有涉及到MySQL数据库的性能监测 服务器基本配置 webbench测试工具 Linux上一款优秀的web性能压力测试工具.webbench最多可以 ...
- C 语言函数手册:涵盖字符测试、字符串操作、内存管理、时间换算、数学计算、文件操作、进程管理、文件权限控制、信号处理、接口处理、环境变量、终端控制
1. 字符测试函数 函数 说明 isascii() 判断字符是否为ASCII码字符 2. 字符串操作 函数 说明 gcvt() 将浮点型数转换为字符串(四舍五入) index() 查找字符串并返回首次 ...
- EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C
首先介绍下这3个文件的关系:可以说INPUT1.C的函数粒度最大,它的函数getdata()就完成了整个INPUT文件数据的读入,该函数又调用了INPUT2.C中的部分函数,INPUT2.C文件中的函 ...
- string.h文件中函数用法
下面为string.h文件中函数的详细用法: strcpy函数名:strcpy功 能: 拷贝一个字符串到另一个用 法: char *strcpy(char *destin, char *source) ...
- 捉虫记(四)线程安全导致的HighCpu
一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...
- C/C++常用头文件及函数汇总
转自: C/C++常用头文件及函数汇总 C/C++头文件一览 C #include <assert.h> //设定插入点#include <ctype.h> //字符处理#in ...
- VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因
VS 2005使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的 ...
- C语言常用的库文件(头文件、函数库)
C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...
随机推荐
- bzoj3622
容斥原理 看见恰好k个就要容斥 g[i]表示有几个b比a小 dp[i][j]表示前i个数至少有j个大的方案数,dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*(g[i]-j+1),就 ...
- SQL 系统表
http://www.cnblogs.com/asdcer/archive/2007/05/14/746377.aspx
- 改变bootstrapSwitch按钮状态
$('.switch-state').bootstrapSwitch('state',true);
- 2.11 Hive中数据导入导出Import和Export使用
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport 一.Export.Import Export ...
- 关于weblogic 10.3.6.0 的漏洞复现(2)
今天小R又学会了一个工具的使用,而且这个工具很强大很强大. 待会介绍. 一.需要的试验环境: 一台宿主机,虚拟机(kali+window2008或其他版本的windows) 1.宿主机需要的工具:B ...
- [WIP]webpack 概念
创建: 2019/04/09 概念 入口 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始. 进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖 ...
- CodeForces 653A【水】
sort一发,去重 #include<cstdio> #include<iostream> #include<queue> #include<string.h ...
- 如何解决启动Error:com.intellij.util.indexing.StorageException问题?
启动tomcat时idea出现如下错误: Error:com.intellij.util.indexing.StorageException: com.intellij.util.indexing.S ...
- 51nod1247(gcd)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1247 题意:中文题诶- 思路:(a, b)可以直接到达(a+b ...
- [Xcode 实际操作]九、实用进阶-(7)使用Xcode的版本管理功能(SCM)
目录:[Swift]Xcode实际操作 本文将演示系统的版本控制功能. 软件配置管理(SCM):Software configuration management 是指通过执行版本控制.变更控制的规程 ...