A. 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
B. 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;
}
C. 請我如何c語言遍歷文件夾
現成的沒有,給你參考下:
c++:
1、CFileFind類實現遍歷文件,FindNext()查找下一個文件
2、比較文件後綴,符合要求就寫入txt
有不懂得話加Q:2311776177!
D. C語言寫一個遍歷全盤搜索文件並返迴文件路徑的程序
給你一個思路:首先先在C盤尋找沒有,依次再去D,E,F,或軟盤A中尋找
磁碟搜索使用()和FindNextVolume()函數
文件搜索使用FindFirstFileEx()和FindNextFile()函數,
具體的函數使用方法就靠你去查詢MSDN了!
呵呵!當然邏輯上的控制也多好好設計!
E. C# 遍歷文件夾下所有子文件夾中的文件,得到文件名
假設a文件夾在F盤下,代碼如下。將文件名輸出到一個ListBox中
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
DirectoryInfo theFolder = new DirectoryInfo(@"F:\a\");
DirectoryInfo[] dirInfo = theFolder.GetDirectories();
//遍歷文件夾
foreach (DirectoryInfo NextFolder in dirInfo)
{
// this.listBox1.Items.Add(NextFolder.Name);
FileInfo[] fileInfo = NextFolder.GetFiles();
foreach (FileInfo NextFile in fileInfo) //遍歷文件
this.listBox2.Items.Add(NextFile.Name);
}
}
}
}
F. C++遞歸遍歷文件目錄,調試成功,但運行後控制台沒顯示數據,這是為什麼
stringnewpath=folderPath+""+Fileinfo.name;
改為:
stringnewpath=folderPath+"\"+Fileinfo.name;
---------------------------------------------------
while(_findnext(Handle,&Fileinfo));
改為:
while(_findnext(Handle,&Fileinfo)==0);
G. 給出一個文件夾,然後程序遍歷該文件夾,記錄里的所有子文件夾及文件
首先是有一個已知的路徑,現在要遍歷該路徑下的所有文件及文件夾,因此定義了一個列表,用於存放遍歷到的文件名。C#代碼如下:
stringpath="給定的文件夾名稱";
List<string>nameList=newList<string>();
Director(path,nameList);
publicvoidDirector(stringdir,List<string>list)
{
DirectoryInfod=newDirectoryInfo(dir);
FileInfo[]files=d.GetFiles();//文件
DirectoryInfo[]directs=d.GetDirectories();//文件夾
foreach(FileInfofinfiles)
{
list.Add(f.Name);//添加文件名到列表中
}
//獲取子文件夾內的文件列表,遞歸遍歷
foreach(DirectoryInfoddindirects)
{
Director(dd.FullName,list);
}
}