EVC下如何根据文件名和扩展名查找文件

auto_dut   2008-6-23 17:33 楼主
我利用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中也不行。

大家来看看我的程序哪里出了问题,不胜感激!!!

回复评论 (8)

FindFirstFile 就会找到第一个文件,你这个没有算,当然会少1. 调用FindFirstFile后应该判断hFile是不是等于INVALID_HANDLE_FILE 如果不等于就找到了第一个文件.所以nFileTotalCount++; 应该放在FindNextFile前面
点赞  2008-6-23 18:22
FindFirstFile 就会找到第一个文件,你这个没有算,当然会少1. 调用FindFirstFile后应该判断hFile是不是等于INVALID_HANDLE_FILE 如果不等于就找到了第一个文件.所以nFileTotalCount++; 应该放在FindNextFile前面
点赞  2008-6-23 18:22
谢谢楼上的,那其他两个问题呢。尤其是扩展名可以查找,而具体的文件名不能查找。
点赞  2008-6-24 16:58
引用: 引用 3 楼 zhzhq800204 的回复:
谢谢楼上的,那其他两个问题呢。尤其是扩展名可以查找,而具体的文件名不能查找。


自己进行处理,查找所有文件。然后对得到的文件名进行判断,就可以实现LZ想要的。
点赞  2008-6-24 17:20
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);
        }
点赞  2008-6-25 09:52
91program,我现在就是用的这个方法,findfirstfile和findnextfile 可以根据文件名查找吗,能够直接查到当然最好了。
点赞  2008-6-27 14:09
可以根据文件名查找,根据文件名的话只要调用FindFirstFile就可以了,根本没有必要调用FindNextFile
点赞  2008-6-27 16:49
很有帮助,苦恼这个问题半天了,但是还是有点不明白
点赞  2010-5-14 09:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复