/**************************************************
這是CBrowseDir的類定義文件BrowseDir.h
/**************************************************
#include"stdlib.h"
classCBrowseDir
{
protected:
//存放初始目錄的絕對路徑,以''結尾
charm_szInitDir[_MAX_PATH];
public:
//預設構造器
CBrowseDir();
//設置初始目錄為dir,如果返回false,表示目錄不可用
boolSetInitDir(constchar*dir);
//開始遍歷初始目錄及其子目錄下由filespec指定類型的文件
//filespec可以使用通配符*?,不能包含路徑。
//如果返回false,表示遍歷過程被用戶中止
boolBeginBrowse(constchar*filespec);
protected:
//遍歷目錄dir下由filespec指定的文件
//對於子目錄,採用迭代的方法
//如果返回false,表示中止遍歷文件
boolBrowseDir(constchar*dir,constchar*filespec);
//函數BrowseDir每找到一個文件,就調用ProcessFile
//並把文件名作為參數傳遞過去
//如果返回false,表示中止遍歷文件
//用戶可以覆寫該函數,加入自己的處理代碼
virtualboolProcessFile(constchar*filename);
//函數BrowseDir每進入一個目錄,就調用ProcessDir
//並把正在處理的目錄名及上一級目錄名作為參數傳遞過去
//如果正在處理的是初始目錄,則parentdir=NULL
//用戶可以覆寫該函數,加入自己的處理代碼
//比如用戶可以在這里統計子目錄的個數
virtualvoidProcessDir(constchar
*currentdir,constchar*parentdir);
};
/*********************************************/
這是CBrowseDir的類實現文件BrowseDir.cpp
/***********************************************/
#include"stdlib.h"
#include"direct.h"
#include"string.h"
#include"io.h"
#include"browsedir.h"
CBrowseDir::CBrowseDir()
{
//用當前目錄初始化m_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//如果目錄的最後一個字母不是'',則在最後加上一個''
intlen=strlen(m_szInitDir);
if(m_szInitDir[len-1]!='\')
strcat(m_szInitDir,"\");
}
boolCBrowseDir::SetInitDir(constchar*dir)
{
//先把dir轉換為絕對路徑
if(_fullpath(m_szInitDir,dir,_MAX_PATH)==NULL)
returnfalse;
//判斷目錄是否存在
if(_chdir(m_szInitDir)!=0)
returnfalse;
//如果目錄的最後一個字母不是'',則在最後加上一個''
intlen=strlen(m_szInitDir);
if(m_szInitDir[len-1]!='\')
strcat(m_szInitDir,"\");
returntrue;
}
boolCBrowseDir::BeginBrowse(constchar*filespec)
{
ProcessDir(m_szInitDir,NULL);
returnBrowseDir(m_szInitDir,filespec);
}
boolCBrowseDir::BrowseDir
(constchar*dir,constchar*filespec)
{
_chdir(dir);
//首先查找dir中符合要求的文件
longhFile;
_finddata_tfileinfo;
if((hFile=_findfirst(filespec,&fileinfo))!=-1)
{
do
{
//檢查是不是目錄
//如果不是,則進行處理
if(!(fileinfo.attrib&_A_SUBDIR))
{
charfilename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
if(!ProcessFile(filename))
returnfalse;
}
}while(_findnext(hFile,&fileinfo)==0);
_findclose(hFile);
}
//查找dir中的子目錄
//因為在處理dir中的文件時,派生類的ProcessFile有可能改變了
//當前目錄,因此還要重新設置當前目錄為dir。
//執行過_findfirst後,可能系統記錄下了相關信息,因此改變目錄
//對_findnext沒有影響。
_chdir(dir);
if((hFile=_findfirst("*.*",&fileinfo))!=-1)
{
do
{
//檢查是不是目錄
//如果是,再檢查是不是.或..
//如果不是,進行迭代
if((fileinfo.attrib&_A_SUBDIR))
{
if(strcmp(fileinfo.name,".")!=0&&strcmp
(fileinfo.name,"..")!=0)
{
charsubdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\");
ProcessDir(subdir,dir);
if(!BrowseDir(subdir,filespec))
returnfalse;
}
}
}while(_findnext(hFile,&fileinfo)==0);
_findclose(hFile);
}
returntrue;
}
boolCBrowseDir::ProcessFile(constchar*filename)
{
returntrue;
}
voidCBrowseDir::ProcessDir(constchar
*currentdir,constchar*parentdir)
{
}
/*************************************************
這是例子example.cpp
/*************************************************
#include"stdio.h"
#include"BrowseDir.h"
//從CBrowseDir派生出的子類,用來統計目錄中的文件及子目錄個數
classCStatDir:publicCBrowseDir
{
protected:
intm_nFileCount;//保存文件個數
intm_nSubdirCount;//保存子目錄個數
public:
//預設構造器
CStatDir()
{
//初始化數據成員m_nFileCount和m_nSubdirCount
m_nFileCount=m_nSubdirCount=0;
}
//返迴文件個數
intGetFileCount()
{
returnm_nFileCount;
}
//返回子目錄個數
intGetSubdirCount()
{
//因為進入初始目錄時,也會調用函數ProcessDir,
//所以減1後才是真正的子目錄個數。
returnm_nSubdirCount-1;
}
protected:
//覆寫虛函數ProcessFile,每調用一次,文件個數加1
virtualboolProcessFile(constchar*filename)
{
m_nFileCount++;
returnCBrowseDir::ProcessFile(filename);
}
//覆寫虛函數ProcessDir,每調用一次,子目錄個數加1
virtualvoidProcessDir
(constchar*currentdir,constchar*parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
};
voidmain()
{
//獲取目錄名
charbuf[256];
printf("請輸入要統計的目錄名:");
gets(buf);
//構造類對象
CStatDirstatdir;
//設置要遍歷的目錄
if(!statdir.SetInitDir(buf))
{
puts("目錄不存在。");
return;
}
//開始遍歷
statdir.BeginBrowse("*.*");
//統計結果中,子目錄個數不含.及..
printf("文件總數:%d 子目錄總數:
%d ",statdir.GetFileCount(),
statdir.GetSubdirCount());
}
Ⅱ 在網上找到的linux下用C遍歷目錄的源代碼 具體看補充。。
1、系統裡面沒有/usr/keygoe/ini文件夾或沒有許可權。可以修改main, 遍歷命令行傳入的文件夾;
2、filename設置為[256][256],如果文件比較多,程序會崩潰的;
3、遍歷子文件夾時,只保存了文件名,沒有添加上級路徑。
Ⅲ linux下C語言怎麼統計某個目錄下的文件個數
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#define MAX 1024
int get_file_count(char *root)
{
DIR *dir;
struct dirent * ptr;
int total = 0;
char path[MAX];
dir = opendir(root); /* 打開目錄*/
if(dir == NULL)
{
perror("fail to open dir");
exit(1);
}
errno = 0;
while((ptr = readdir(dir)) != NULL)
{
//順序讀取每一個目錄項;
//跳過「..」和「.」兩個目錄
if(strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0)
{
continue;
}
//printf("%s%s/n",root,ptr->d_name);
//如果是目錄,則遞歸調用 get_file_count函數
if(ptr->d_type == DT_DIR)
{
sprintf(path,"%s%s/",root,ptr->d_name);
//printf("%s/n",path);
total += get_file_count(path);
}
if(ptr->d_type == DT_REG)
{
total++;
printf("%s%s/n",root,ptr->d_name);
}
}
if(errno != 0)
{
printf("fail to read dir"); //失敗則輸出提示信息
exit(1);
}
closedir(dir);
return total;
}
int main(int argc, char * argv[])
{
int total;
if(argc != 2)
{
printf("wrong usage/n");
exit(1);
}
total = get_file_count(argv[1]);
printf("%s ha %d files/n",argv[1],total);
return 0;
}
Ⅳ C/C++編程遍歷文件夾,統計當前文件個數,輸出文件名
這個要正對不同的操作系統,不同的操作系統,文件節點的存放方式不一樣,讀取的方式就不一樣了。
可以利用for循環,像Linux
dir=opendir
(dirname)打開文件夾,返回目錄指針,dp=readdir(dir)利用讀目團咐錄,返回一行行讀取目錄的文件結構體指針,指針中存的有文件屬性,是文件,還是文件夾。
通過判鏈或好斷是文件或棚鉛者文件夾:
如果是文件,就就輸出文件名dp->name
否則,就是一個文件夾
繼續dir1=opendir(dp->name),dp1=readdir(dir1)..
一直循環到判斷不到目錄了。
windows應該也有類似的函數吧,這個我就么有用過了,你找找。
Ⅳ 請我如何c語言遍歷文件夾
#include <windows.h>
/************************************************/
*參數說明:
char *pszDestPath為需要遍歷的目標路徑
/************************************************/
EnmuDirectory(char *pszDestPath)
{
//此結構說明參MSDN
WIN32_FIND_DATA FindFileData;
//查找文件的句柄
HANDLE hListFile;
//絕對路徑,例:c:\windows\system32\cmd.exe
char szFullPath[MAX_PATH];
//相對路徑
char szFilePath[MAX_PATH];
//構造相對路徑
wsprintf(szFilePath, "%s\\*", pszDestPath);
//查找第一個文件,獲得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE則返回
if((hListFile = FindFirstFile(szFilePath, &FindFileData)) == INVALID_HANDLE_VALUE)
{
//查找文件錯誤
return 1;
}
else
{
do
{
//過濾.和..
//「.」代表本級目錄「..」代表父級目錄
if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||
lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )
{
continue;
}
//構造全路徑
wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName);
//讀取文件屬性,如果不是文件夾
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
//這里你可以自己添加分析是某種類型文件的代碼。可以根據
//擴展名分析。
//這里有個實例,你可以看看
//有必要初始化一下
char *pszFileType = NULL;
//把pszFileType指向cFileName的倒數第三個數符。因為一般擴展名長為3個字元。
//當然,你也可以用其它方法分析擴展名。或倒序查「.」
pszFileType = &(FindFileData.cFileName[strlen(FindFileData.cFileName) - 3]);
//如果是jpg結尾的文件
if(!stricmp(pszFileType, "jpg"))
{
FILE *fp;
//或許這里打開C:\\data.txt不應該用"w+",你可試著來
fp = fopen("c:\\data.txt", "w+");
if(fp) fputs(szFullPath, fp);
fclose(fp);
}
}
//如果是文件夾,則遞歸調用EnmuDirectory函數
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
EnmuDirectory(szFullPath);
}
//循環,查找下一個文件
}while(FindNextFile(hListFile, &FindFileData));
}
//關閉句柄
FindClose(hListFile);
//清空結構。可有可無的一句代碼。函數退出會自動清空。
ZeroMemory(&FindFileData, sizeof(FindFileData));
return 0;
}
這是windows api版的,還有MFC版的和C版的。要的話來找我Q:503267714
Ⅵ Linux下C語言:如何遍歷制定目錄及其子目錄下所有文件的文件名並將其按照最後修改時間排序呢
linux中有相關的API函數,可以讀取目錄中所有的文件名字,以及時間屬性信息,你把這些信息讀出來,利用各種排序演算法排序就可以了
Ⅶ C# 遍歷文件夾下所有子文件夾中的文件,得到文件名
輸入某文件夾路徑,遍歷該文件夾及其子文件夾(包括子文件夾的子文件夾等),獲取其中所有文件的函數:
/// <summary>
/// 查找指定文件夾下指定後綴名的文件
/// </summary>
/// <param name="directory">文件夾</param>
/// <param name="pattern">後綴名</param>
/// <returns>文件路徑</returns>
public void GetFiles(DirectoryInfo directory, string pattern, ref List<string> fileList)
foreach (FileInfo info in directory.GetFiles(pattern))
catch (System.Exception ex)
foreach (DirectoryInfo info in directory.GetDirectories())//獲取文件夾下的子文件夾
語言結構
類:一個基本的C#類中包含數據成員、屬性、構造器和方法。屬性可以是靜態或實例成員。在C#中類的聲明與C++和Java很相似。但是,不像C++,C#結構體與類是不支持繼承多個父類。但是,與Java相同的是,一個結構體可以實現介面(interface)。Java的關鍵字import已經被替換成using,它起到了同樣的作用。
以上內容參考:網路-c#
Ⅷ 如何列出linux的文件目錄和所有的文件
顯示目錄文件用linux中ls命令
ls 命令可以說是linux下最常用的命令之一。
-a 列出目錄下的所有文件,包括以 . 開頭的隱含文件。
-b 把文件名中不可輸出的字元用反斜杠加字元編號(就象在C語言里一樣)的形式列出。
-c 輸出文件的 i 節點的修改時間,並以此排序。
-d 將目錄象文件一樣顯示,而不是顯示其下的文件。
-e 輸出時間的全部信息,而不是輸出簡略信息。
-f -U 對輸出的文件不排序。
-g 無用。
-i 輸出文件的 i 節點的索引信息。
-k 以 k 位元組的形式表示文件的大小。
-l 列出文件的詳細信息。
-m 橫向輸出文件名,並以「,」作分格符。
-n 用數字的 UID,GID 代替名稱。
-o 顯示文件的除組信息外的詳細信息。
-p -F 在每個文件名後附上一個字元以說明該文件的類型,「*」表示可執行的普通
文件;「/」表示目錄;「@」表示符號鏈接;「|」表示FIFOs;「=」表示套
接字(sockets)。
-q 用?代替不可輸出的字元。
-r 對目錄反向排序。
-s 在每個文件名後輸出該文件的大小。
-t 以時間排序。
-u 以文件上次被訪問的時間排序。
-x 按列輸出,橫向排序。
-A 顯示除 「.」和「..」外的所有文件。
-B 不輸出以 「~」結尾的備份文件。
-C 按列輸出,縱向排序。
-G 輸出文件的組的信息。
-L 列出鏈接文件名而不是鏈接到的文件。
-N 不限制文件長度。
-Q 把輸出的文件名用雙引號括起來。
-R 列出所有子目錄下的文件。
-S 以文件大小排序。
-X 以文件的擴展名(最後一個 . 後的字元)排序。
-1 一行只輸出一個文件。
--color=no 不顯示彩色文件名
--help 在標准輸出上顯示幫助信息。
--version 在標准輸出上輸出版本信息並退出。
只列出子目錄
1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)
計算當前目錄下的文件數和目錄數
下面命令可以分別計算當前目錄下的文件和目錄個數:
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l -- to count dir
顯示彩色目錄列表
打開/etc/bashrc, 加入如下一行:
alias ls="ls --color"
Ⅸ 如何在linux系統中用C語言編程實現以非遞歸的方式查詢指定目錄下所有子目錄的全部文件並保存文件名
把迭代得到的非文件文件夾項,即子目錄保存到一個stack中。
隨後逐個彈出棧頂元素並迭代之,就實現了以非遞歸方式遍歷文件夾。