今天在服务器上部署算法的时候,其中的两个遍历文件夹的函数报了错误。具体定位在_findnext()这个函数这里,0xC0000005错误 。原函数如下:
void getFiles(string path, vector<string>& files)
{
//file handle
long hFile = 0;
//file info
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))//if it's a directory,then iterate.Or add it to the list
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//hidden folder or file
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);//recursive
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
void getFilesNorecurs(string path, vector<string>& files)//push all the files under the path into the "files" vector
{
//file handle
long hFile = 0;// the return type of _findfirst is long
//file info
struct _finddata_t fileinfo;//_finddata_t is a struct to store the file info
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)//Find all the files under this folder.If failed,return -1.
{
do
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));//assign is substitute
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
后来查询资料发现,这两个函数原来的运行环境是win7。_findnext()第一个参数”文件句柄”,返回的类型为intptr_t(long long),如果定义为long,在win7中是没有问题,但是在windows server 2012 r2中就要改为long long或者intptr_t。
所以只要把hFile的数据类型更改一下就可以了。
即改成:
long long hFile = 0;