A. C/C++编程遍历文件夹,统计当前文件个数,输出文件名
#include<vector>
#include<iostream>
#include<windows.h>
using namespace std;
void searchFileInDirectroy( const string& dir, vector<string>& outList )
{
WIN32_FIND_DATA findData;
HANDLE hHandle;
string filePathName;
string fullPathName;
filePathName = dir;
filePathName += "\\*.*";
hHandle = FindFirstFile( filePathName.c_str(), &findData );
if( INVALID_HANDLE_VALUE == hHandle )
{
cout<<"Error"<<endl;
return;
}
do
{
if( strcmp(".", findData.cFileName) == 0 || strcmp("..", findData.cFileName) == 0 )
{
continue;
}
fullPathName = dir;
fullPathName += "\\";
fullPathName += findData.cFileName;
if( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
searchFileInDirectroy( fullPathName, outList );
}
else
{
outList.push_back(fullPathName);
}
} while( FindNextFile( hHandle, &findData ) );
FindClose( hHandle );
}
int main()
{
vector<string> pathList;
searchFileInDirectroy("D:\test", pathLIst);
return 0;
}
searchFileInDirectroy 就是用来遍历指定文件夹下的文件及其子目录的。聪明的你一定知道它为什么可以遍历子目录!对啦,这个函数内部判断了取到的文件的属性是否是目录( if( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ),如果是,就要递归调用本身函数,直到没有子目录为止。如果你不需要查询子目录,我想你应该知道怎么做。
我用的是远程登录,所以代码没办法过来,以上代码都是我手敲的,如果编译有错你就试着改改吧,函数本身的算法是可以工作的。
B. C语言:如何遍历指定的文件夹(可以包括子文件夹)中的每一个文件名
Function SearchFiles(Path As String, FileType As String)
Dim Files() As String '文件路径
Dim Folder() As String '文件夹路径
Dim a, b, c As Long
Dim sPath As String
sPath = Dir(Path & FileType) '查找第一个文件
Do While Len(sPath) '循环到没有文件为止
a = a + 1
ReDim Preserve Files(1 To a)
Files(a) = Path & sPath '将文件目录和文件名组合,并存放到数组中
List1.AddItem Files(a) '加入控件中
sPath = Dir '查找下一个文件
DoEvents '让出控制权
Loop
sPath = Dir(Path & "\", vbDirectory) '查找第一个文件夹
Do While Len(sPath) '循环到没有文件夹为止
If Left(sPath, 1) <> "." Then '为了防止重复查找
If GetAttr(Path & "\" & sPath) And vbDirectory Then '如果是文件夹则。。。。。。
b = b + 1
ReDim Preserve Folder(1 To b)
Folder(b) = Path & sPath & "\" '将目录和文件夹名称组合形成新的目录,并存放到数组中
End If
End If
sPath = Dir '查找下一个文件夹
DoEvents '让出控制权
Loop
For c = 1 To b '使用递归方法,遍历所有目录
SearchFiles Folder(c), FileType
Next
End Function
Private Sub Command1_Click() '调用
SearchFiles "e:\", "*.exe"
End Sub
C. windows下使用C/C++怎么遍历目录并读取目录下的文件列表
//FileScan.cpp:定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<filesystem>
#include<windows.h>
#defineOK0
#defineERR-1
#defineTEST_FILE_MAX_SIZE"4.67G"
#defineEXT_LEN8
#defineTYPE_LEN8
#defineDIR_MAX_LEN260//文件路径最多256个字符,加上D:\
//ftell()返回int,最大2G1<<32-1
typedefenumCOND_VALUE
{
COND_VALUE_MORE=0,//大于
COND_VALUE_LESS=1,//小于
COND_VALUE_EUAQL=2,//等于
COND_VALUE_MAX=0xf
}COND_VALUE_E;
typedefenumCOND_TYPE
{
COND_TYPE_SIZE=0,
COND_TYPE_CTIME=1,
COND_TYPE_MTIME=2,
COND_TYPE_EXTNAME=4,
COND_TYPE_FILETYPE=8,
COND_TYPE_MAX=0xf
}COND_TYPE_E;
typedefstructCOND_INFO
{
charcCondType:4;
charcCondValue:4;
}COND_INFO_S;
typedefstructFILE_COND
{
//按照bit位来划分,前面四个bit位表示条件类型,后面四个bit位表示条件值
charcSymbol;//用来标志大于或者小于,搜索时间,大小,类型,扩展名,属性
charszRes[3];//预留3个字节,四字节对齐
unsignedintuiSizeHigh;//文件大小高位
unsignedintuiSizeLow;//低位
unsignedintuiCStartTime;//创建时间
unsignedintuiCEndTime;
unsignedintuiMStartTime;//修改时间
unsignedintuiMEndTime;
charszExtName[EXT_LEN];//扩展名
charszFileType[TYPE_LEN];//文件类型
unsignedintuiFileAttrib;//文件属性
unsignedintuiFolderSizeHight;//文件夹大小
unsignedintuiFolderSizeLow;
}FILE_COND_S;
//最大允许多少个条件搜索
#defineCONDITION_MAX4
FILE_COND_Sg_astCond[CONDITION_MAX]={0};
intg_iCondCnt=0;
intDisposeFile(charszFilePath[],WIN32_FIND_DATAstWinFile)
{
DWORDLONGdwHighBase=MAXDWORD;
dwHighBase+=1;
DWORDLONGFileSize=stWinFile.nFileSizeHigh*dwHighBase+stWinFile.nFileSizeLow;
printf("%s\%s--Size:%lu ",szFilePath,stWinFile.cFileName,FileSize);
returnOK;
}
//转换字符串文件大小(如45.67G)到int类型的文件大小
#defineSECTION_CNT2
#defineMAX_NUM_DEC100
#defineUNIT_CNT4
#defineKB_OFFSET10//1KB==1BIT<<10;
#defineMB_OFFSET20
#defineGB_OFFSET30
#defineTB_OFFSET40
#defineINT_OFFSET32
intConvertSizeStr2SizeLong(charszSizeStr[],unsignedint*puiSizeHigh,unsignedint*puiSizeLow)
{
intaNumSect[SECTION_CNT]={0};//分别存整数位和小数位
//charsz="...";
characValidUint[UNIT_CNT]={'K','M','G','T'};//数组
//characValidUint[]="KMGT";//字符串
characOffset[UNIT_CNT]={KB_OFFSET,MB_OFFSET,GB_OFFSET,TB_OFFSET};
charcOffset=0;
intiBaseNum;
char*pcTmp;
intindex=0;
inti;
intiMask;
//入参判断
if(szSizeStr==NULL)
{
returnERR;
}
pcTmp=szSizeStr;
while(*pcTmp!=0)
{
if(*pcTmp=='.')
{
index++;
if(index>=SECTION_CNT)
{
returnERR;
}
}
elseif(*pcTmp>='0'&&*pcTmp<='9')
{
//小数位取3位,剩余的舍去
if(index==1&&aNumSect[index]>MAX_NUM_DEC)
{
pcTmp++;
continue;
}
elseif(index==0&&aNumSect[index]>MAX_NUM_DEC)
{
//1234G不合法,应该写成1.234T
returnERR;
}
aNumSect[index]=aNumSect[index]*10+*pcTmp-'0';
}
else
{
for(i=0;i<UNIT_CNT;++i)
{
if(toupper(*pcTmp)==acValidUint[i])
{
break;
}
}
if(i==UNIT_CNT)
{
returnERR;
}
}
pcTmp++;
}
if(cOffset==0)
{
*puiSizeHigh=0;
*puiSizeLow=aNumSect[0];
}
else
{
//先转为下一级单位
iBaseNum=(aNumSect[0]<<KB_OFFSET)+aNumSect[0];//能保证小于MAX_UNIT
cOffset-=KB_OFFSET;
}
iMask=(1<<cOffset)-1;//用于取低于(INT_OFFSET-cOffset)数据
*puiSizeHigh=(iBaseNum>>(INT_OFFSET-cOffset))&iMask;
*puiSizeLow=iBaseNum<<cOffset;
returnOK;
}
//比较文件大小
intCompareFileSize(WIN32_FIND_DATAstWinFile,FILE_COND_SstCond,charcCondValue)
{
switch(cCondValue)
{
caseCOND_VALUE_LESS:
{
if(stWinFile.nFileSizeHigh>stCond.uiSizeHigh)
{
returnERR;
}
elseif(stWinFile.nFileSizeHigh==stCond.uiSizeHigh)
{
if(stWinFile.nFileSizeLow>stCond.uiSizeLow)
{
returnERR;
}
}
break;
}
caseCOND_VALUE_MORE:
{
if(stWinFile.nFileSizeHigh<stCond.uiSizeHigh)
{
returnERR;
}
elseif(stWinFile.nFileSizeHigh==stCond.uiSizeHigh)
{
if(stWinFile.nFileSizeLow<stCond.uiSizeLow)
{
returnERR;
}
}
break;
}
caseCOND_VALUE_EUAQL:
{
if(stWinFile.nFileSizeHigh!=stCond.uiSizeHigh||stWinFile.nFileSizeLow!=stCond.uiSizeLow)
{
returnERR;
}
break;
}
default:
break;
}
returnOK;
}
intCompareFileTime(WIN32_FIND_DATAstWinFile,FILE_COND_SstCond,charcCondValue)
{
returnOK;
}
intCheckCondition(charszFilePath[],WIN32_FIND_DATAstWinFile)
{
inti;
intiCondType;
intiCondValue;
COND_INFO_S*pstCondInfo;
for(i=0;i<g_iCondCnt;++i)
{
pstCondInfo=(COND_INFO_S*)(&(g_astCond[i].cSymbol));
switch(pstCondInfo->cCondType)
{
caseCOND_TYPE_SIZE:
{
if(CompareFileSize(stWinFile,g_astCond[i],pstCondInfo->cCondValue)!=OK)
{
returnERR;
}
break;
}
caseCOND_TYPE_CTIME:
{
if(CompareFileTime(stWinFile,g_astCond[i],pstCondInfo->cCondValue)!=OK)
{
returnERR;
}
break;
}
//...
default:
break;
}
}
returnOK;
}
intScanDir(charszDir[])
{
if(szDir==NULL)
{
returnERR;
}
charszSubDir[DIR_MAX_LEN]={0};
charszFind[DIR_MAX_LEN]={0};
WIN32_FIND_DATAstWinFile;
HANDLEhd;
_snprintf_c(szFind,
DIR_MAX_LEN,
"%s\*",
szDir);//两个反斜杠表示一个反斜杠转义符
hd=FindFirstFile(szFind,&stWinFile);//hd标志文件位置,用于查找下一个文件
if(hd==INVALID_HANDLE_VALUE)
{
returnERR;
}
while(1)
{
if(strcmp(stWinFile.cFileName,".")==0||strcmp(stWinFile.cFileName,"..")==0)
{
//NULL
}
//判断是否是文件夹
elseif(stWinFile.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
{
//清空szSubDir,因为在重新对szSubDir赋值时,是直接覆盖的,后者比当前保存的数据短,所以需要先清空再赋值
memset(szSubDir,0,DIR_MAX_LEN);
_snprintf_c(szSubDir,DIR_MAX_LEN,"%s\%s",szDir,stWinFile.cFileName);
ScanDir(szSubDir);//递归处理
}
else
{
if(CheckCondition(szDir,stWinFile)==OK)
{
DisposeFile(szDir,stWinFile);
}
}
//查找下一个文件失败就跳出循环
if(!FindNextFile(hd,&stWinFile))
{
break;
}
}
FindClose(hd);
returnOK;
}
int_tmain(intargc,_TCHAR*argv[])
{
COND_INFO_SstCond={0};
COND_INFO_S*pstCond;
charszDir[]="C:";
stCond.cCondValue=COND_TYPE_SIZE;
stCond.cCondValue=COND_VALUE_MORE;
if(ConvertSizeStr2SizeLong(TEST_FILE_MAX_SIZE,&(g_astCond[0].uiSizeHigh),&(g_astCond[0].uiSizeLow))==OK)
{
memcpy(&(g_astCond[0].cSymbol),&stCond,1);
pstCond=(COND_INFO_S*)(&g_astCond[0].cSymbol);
g_iCondCnt=1;
ScanDir(szDir);
}
system("pause");
return0;
}
D. 请我如何c语言遍历文件夹
现成的没有,给你参考下:
c++:
1、CFileFind类实现遍历文件,FindNext()查找下一个文件
2、比较文件后缀,符合要求就写入txt
有不懂得话加Q:2311776177!
E. C/C++编程遍历文件夹,统计当前文件个数,输出文件名
#include<vector>
#include<iostream>
#include<windows.h>
using
namespace
std;
void
searchfileindirectroy(
const
string&
dir,
vector<string>&
outlist
)
{
win32_find_data
finddata;
handle
hhandle;
string
filepathname;
string
fullpathname;
filepathname
=
dir;
filepathname
+=
"\\*.*";
hhandle
=
findfirstfile(
filepathname.c_str(),
&finddata
);
if(
invalid_handle_value
==
hhandle
)
{
cout<<"error"<<endl;
return;
}
do
{
if(
strcmp(".",
finddata.cfilename)
==
0
||
strcmp("..",
finddata.cfilename)
==
0
)
{
continue;
}
fullpathname
=
dir;
fullpathname
+=
"\\";
fullpathname
+=
finddata.cfilename;
if(
finddata.dwfileattributes
&
file_attribute_directory
)
{
searchfileindirectroy(
fullpathname,
outlist
);
}
else
{
outlist.push_back(fullpathname);
}
}
while(
findnextfile(
hhandle,
&finddata
)
);
findclose(
hhandle
);
}
int
main()
{
vector<string>
pathlist;
searchfileindirectroy("d:\test",
pathlist);
return
0;
}
searchfileindirectroy
就是用来遍历指定文件夹下的文件及其子目录的。聪明的你一定知道它为什么可以遍历子目录!对啦,这个函数内部判断了取到的文件的属性是否是目录(
if(
finddata.dwfileattributes
&
file_attribute_directory
)
),如果是,就要递归调用本身函数,直到没有子目录为止。如果你不需要查询子目录,我想你应该知道怎么做。
我用的是远程登录,所以代码没办法过来,以上代码都是我手敲的,如果编译有错你就试着改改吧,函数本身的算法是可以工作的。
F. 怎么用C语言遍历文件啊
三种方法可以实现:
1 按字节遍历:
逐个字节读取文件,达到遍历的效果。
int c;
while((c = fgetc(fp)) != EOF) //读取每个字节,fp为打开的文件指针。
{
//对c做一些操作。 c就是遍历中的每个字节。
}
2 按行遍历:
利用fgets,逐行读取文件进行遍历。
char buf[1024];
while(fgets(buf)) //逐行读取文件。
{
//对buf做操作,buf为每一行的数据。
}
3 将文件整个读到内存,按照字符数组进行遍历。
可以将文件整体读到内存,对内存空间进行多样化遍历,这种方式适用于文件比较小,且遍历次数较多的情况,可以提高效率。
读取文件可以采用1中的逐个字节读取的方式,存到内存空间。
G. C语言遍历目录中的文件
使用dir.h库的两个函数即可:findfirst和findnext。
首先调用findfirst函数查找是否有满足条件的某目录文件,如果返回值非0则表示找不到返回。
如果findfirst返回值为0,则循环调用findnext函数,根据返回值,如果为0,结束循环,遍历结束。否则循环调用findnext即可遍历,直到返回非0值即可。
当然,这两个函数需要定义一个结构体来存储函数返回的数据。结构体如下:
struct
ffblk
{
char
ff_reserved[21];
/*DOS保留字*/
char
ff_attrib;
/*文件属性*/
int
ff_ftime;
/*文件时间*/
int
ff_fdate;
/*文件日期*/
long
ff_fsize;
/*文件长度*/
char
ff_name[13];
/*文件名*/
}
将结构体中的ff_name[13]显示出来即可。