在网上找了一些代码都不能用,后来才知道是因为visual 2005下默认用的是UNICODE,所以不能输出文件名。下面是在2005下可以运行的代码,输出是文件的全路径,每个文件夹中所有文件的全路径保存在allFileName里面。代码是在一个网友的代码的基础上做了简单修改得到的,把FindFirstFile改成了 FindFirstFileA,其它小的修改就不缀述了,另外在运行代码的时候要把Project/properties里面的General的Use of MFC改成Use MFC in a shared DLL。这样代码就可以运行了:D#include "stdafx.h"
#include
#include "windows.h"
#include
#include
#include using namespace std;string folder;//读入一个文件夹中的所有文件的名字,包括子文件夹
void Find(TCHAR *szDir)
{
string allFilename;
int count =0; //每个子文件夹中的文件个数
TCHAR szTempDir[MAX_PATH + 1]; WIN32_FIND_DATAA FindFileData;
HANDLE hFind;
strcpy((char *)szTempDir,(const char*)szDir);
strcat((char*)szTempDir,"*.*"); //*.*表示所有类型文件
//读取第一个满足要求的文件
hFind =FindFirstFileA((LPCSTR)szTempDir,&FindFileData); if (hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid File Handle. Get LastError reports %d
", GetLastError ());
return;
} int a=1; do
{
//如果遇到文件夹,递归
if( (FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY ) && strcmp((const char*)FindFileData.cFileName,".")
&& strcmp((const char*)FindFileData.cFileName,".."))
{ TCHAR szNewDir[MAX_PATH+1];
strcpy((char *)szNewDir,(const char *)szDir);
strcat((char *)szNewDir,(const char*)FindFileData.cFileName);
strcat((char *)szNewDir,"\");
string folderTmp( (char *)FindFileData.cFileName );
folder = folderTmp;
Find(szNewDir); } //如果是.或者..继续读取下一个
else if(strcmp((const char*)FindFileData.cFileName,".")==0||strcmp((const char*)FindFileData.cFileName,"..")==0)
{
a=FindNextFileA(hFind,&FindFileData);
} else //如果是文件
{
TCHAR fileDir[MAX_PATH+1];
strcpy((char *)fileDir,(const char *)szDir);
strcat((char *)fileDir,(const char*)FindFileData.cFileName);
string oneFilename( (char *)fileDir );
allFilename += oneFilename + "
";
count++;
} a =FindNextFileA(hFind,&FindFileData);//找到当前文件句柄的下一个文件 }while(a); if( count > 0 )
{ cout << "文件夹"<< folder<< "中的文件
";
cout << "文件个数为: "<< count<< "
";
cout << allFilename<<"
";
//////////ADDCODE //对文件的处理的代码就可以加在这里了
allFilename.clear(); }
FindClose(hFind);
}void main()
{
Find((TCHAR*)("C:\main\")); //文件夹所在的路径
getchar();
}