我利用FindFirstFile和FindNextFile 系统中已存在的文件,代码如下:
CString cFileList[50];
int nFileTotalCount;
nFileTotalCount=0;
HANDLE hFile = NULL;
WIN32_FIND_DATA lpFindFileData;
// BOOL bContinue = FALSE;
int i = 0;
for(i=0;i <50;i++)
cFileList=_T("");
i = 0;
hFile = FindFirstFile(_T("*.kwj"),&lpFindFileData);
while (1)
{
cFileList=lpFindFileData.cFileName;
if (FindNextFile(hFile,&lpFindFileData)==0)
{
FindClose(hFile);
break;
}
i++;
nFileTotalCount++;
}
return nFileTotalCount;
问题1:
如果我输入文件的扩展名,可以查找到该扩展名文件。但是返回的nFileTotalCount比实际数目少1,比如应该是2,但返回的是1.我在系统中建立了1.kwj和2.kwj文件,单步执行时会先找到2.kwj,在下一个循环中,lpFindFileData.cFileName=1.kwj,但是FindNextFile(hFile,&lpFindFileData)返回为0.
问题2:hFile = FindFirstFile(_T("*.kwj"),&lpFindFileData);
如果根据文件名称查找,不能找到该文件,但是实际情况是该文件确实存在。比如hFile = FindFirstFile(_T("1.kwj"),&lpFindFileData); ,此时返回的nFileTotalCount=0;
问题3:
我最开始使用的是CFileFind类,但编译时错误,提示没有CFileFind类,将afx.h放到stdafx.h中也不行。
大家来看看我的程序哪里出了问题,不胜感激!!!
FindFirstFile 就会找到第一个文件,你这个没有算,当然会少1. 调用FindFirstFile后应该判断hFile是不是等于INVALID_HANDLE_FILE 如果不等于就找到了第一个文件.所以nFileTotalCount++; 应该放在FindNextFile前面
FindFirstFile 就会找到第一个文件,你这个没有算,当然会少1. 调用FindFirstFile后应该判断hFile是不是等于INVALID_HANDLE_FILE 如果不等于就找到了第一个文件.所以nFileTotalCount++; 应该放在FindNextFile前面
谢谢楼上的,那其他两个问题呢。尤其是扩展名可以查找,而具体的文件名不能查找。
引用: 引用 3 楼 zhzhq800204 的回复:
谢谢楼上的,那其他两个问题呢。尤其是扩展名可以查找,而具体的文件名不能查找。
自己进行处理,查找所有文件。然后对得到的文件名进行判断,就可以实现LZ想要的。
FindFirstFile
FindNextFile
只能对输入的当前目录进行搜索,
FindFirstFile(_T("\\当前搜索目录\\*.kwj"),&lpFindFileData);
如当前目录为根目录,则为\\*.kwj
如果文件在子文件夹中,需要对两个api返回的文件句柄进行判断,如果为文件夹就要进入该文件夹
用同样的方式搜索(可以在当前函数中使用递归)。
如果为文件就要判断文件名称是否和你需要的一致。
hp = FindFirstFile( fileFound, &info );
if(hp != INVALID_HANDLE_VALUE)
{
do
{
swprintf(fileFound, L"%s\\%s", lpFolderPath, info.cFileName);
DWORD dwAttribs = GetFileAttributes(fileFound);
if (dwAttribs & FILE_ATTRIBUTE_DIRECTORY)
{
。。。。
}
else
{
。。。。
}
}
while(FindNextFile(hp, &info));
FindClose(hp);
}
91program,我现在就是用的这个方法,findfirstfile和findnextfile 可以根据文件名查找吗,能够直接查到当然最好了。
可以根据文件名查找,根据文件名的话只要调用FindFirstFile就可以了,根本没有必要调用FindNextFile