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]顯示出來即可。