问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C/C++编程遍历文件夹,统计当前文件个数,输出文件名

发布网友 发布时间:2022-04-26 15:19

我来回答

1个回答

热心网友 时间:2022-05-18 15:21

标准C是没有目录相关的函数的
CFree是16位的吧,那就更不用想了.貌似只能内嵌汇编使用dos中断来完成.

还是换编译器吧devcpp codeblock vc8 之类的都很好

【cmail】:
这个要用到windows API

HANDLE FindFirstFile(
LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
);

BOOL FindNextFile(
HANDLE hFindFile,
LPWIN32_FIND_DATA lpFindFileData
);

WIN32_FIND_DATA

【CHROX】:
在Win32平台下不用windows api,有好多功能实现起来都很费劲,特别是系统相关的
再说用api又不是什么丢人的事。开发可移植程序除外。
用FindFirstFile和FindNextFile两个api很容易实现
////////////////////////////////////////////////
void FindFile(LPCTSTR lpszPath) {
TCHAR szFind[MAX_PATH];
lstrcpy(szFind,lpszPath);

if(!IsRoot(szFind)) lstrcat(szFind,"\\");
lstrcat(szFind,"*.*");
WIN32_FIND_DATA wfd;
HANDLE hFind=FindFirstFile(szFind,&wfd);

if(hFind==INVALID_HANDLE_VALUE) return;
do{
if(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0) continue;
char szFile[MAX_PATH];
lstrcpy(szFile,lpszPath);
if(!IsRoot(szFile)) lstrcat(szFile,"\\");
lstrcat(szFile,wfd.cFileName);
if((GetFileAttributes(szFile)&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY){
FindFile(szFile); //递归
}
else {
} //Do your things
}
} while (FindNextFile(hFind,&wfd));
CloseHandle(hFind);
}

【Geomatic】:
原来FindFirstFile和FindNextFile是WINDOWS的API 我晕 我以为是C++的函数库里的东西呢
我明白了 我找到的代码和CHROX的差不多
#include <stdio.h>
#include <windows.h>

BOOL IsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}

void FindInAll(::LPCTSTR lpszPath)
{TCHAR szFind[MAX_PATH];<br>lstrcpy(szFind, lpszPath);<br>if (!IsRoot(szFind))<br>lstrcat(szFind, "\\");<br>lstrcat(szFind, "*.*"); // 找所有文件<br>WIN32_FIND_DATA wfd;<br>HANDLE hFind = FindFirstFile(szFind, &wfd);<br>if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败<br>return;<br><br>do<br>{<br>if (wfd.cFileName[0] == '.')<br>continue; // 过滤这两个目录<br>if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)<br>{<br>TCHAR szFile[MAX_PATH];<br>if (IsRoot(lpszPath))<br>wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);<br>else<br>wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);<br>FindInAll(szFile); // 如果找到的是目录,则进入此目录进行递归<br>}
else
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
printf("%s\n",szFile);
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄

}
int main(int argc, char* argv[])
{
FindInAll("g://music");
return 0;
}
谢谢大家的帮助

【Geomatic】:
这个怎么给你们给分啊
那个分有用吗
刚申请的 好多功能不会用啊

【cmail】:
点上面的“管理”。

【CHROX】:
分可是个好东西。呵呵,你以后就明白了。

【jixingzhong】:
DEV C++, 利用链表实现目录内所有文件列表显示

#include <stdio.h>
#include <dirent.h>
/*#include <alloc.h>*/
#include <string.h>

void main(int argc,char *argv[])
{
DIR *directory_pointer;
struct dirent *entry;
struct FileList
{
char filename[64];
struct FileList *next;
}start,*node;
if (argc!=2)
{
printf("Must specify a directory\n");
exit(1);
}
if ((directory_pointer=opendir(argv[1]))==NULL)
printf("Error opening %s\n",argv[1]);
else
{
start.next=NULL;
node=&start;
while ((entry=readdir(directory_pointer))!=NULL)
{
node->next=(struct FileList *)malloc(sizeof(struct FileList));
node=node->next;
strcpy(node->filename,entry->d_name);
node->next=NULL;
}
closedir(directory_pointer);
node=start.next;
while(node)
{
printf("%s\n",node->filename);
node=node->next;
}
}
}

【jixingzhong】:
linux下面的,作者不是我

A Demo written by camelrain

/*
the program find a file from current directory or your defined directory
commond optinon [path] filename
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define LENGTH 256

/* just if is a directory*/
static int IsDir (char * name);
/* search target file, arg1 is current path, arg2 is target file*/
static void search_file (char * path, char * name);

static int search_flag=0;

/*just if is a directory*/
static int IsDir (char * name) {
struct stat buff;

if (lstat(name,&buff)<0)
return 0; //if not exist name ,ignore

/*if is directory return 1 ,else return 0*/
return S_ISDIR(buff.st_mode);
}

/*search target file*/
static void search_file (char * path, char * name) {
DIR *directory;
struct dirent * dir_entry;
char buffer[LENGTH];

if ((directory=opendir(path)) == NULL) {
fprintf(stderr, "%s", path);
perror(" ");
return;
}

while (dir_entry=readdir(directory)) {
if (!strcmp(dir_entry->d_name,".")||!strcmp(dir_entry->d_name,"..")) {
/* do nothing*/
}
else {
/* if is boot directory add "/" */
if ((strcmp(path,"/"))==0)
sprintf(buffer,"%s%s",path,dir_entry->d_name);
/* if is not boot directory do not add "/"*/
else
sprintf(buffer,"%s/%s",path,dir_entry->d_name);

//printf("Now file : %s\n",buffer);
if (IsDir(buffer))
search_file (buffer , name);
else {
if (strcmp(dir_entry->d_name,name)==0)
{
printf("%s\n",buffer);
search_flag=1;
}
}
}
}
closedir(directory);
}

int main(int argc, char *argv[])
{
static char * current_dir;
static char * filename;
int length;

if (argc==1) {
printf("A few parameters!!\n");
return 0;
}

if (argc==2) {
current_dir=(char * )getcwd(current_dir,LENGTH);
filename=argv[1];
}

if (argc==3) {
length=strlen(argv[1]);

if (length>1 && (argv[1][length-1]=='/')) {
argv[1][length-1]='\0';
//printf("%d\n",strlen(argv[1]));
}

current_dir=argv[1];
filename=argv[2];
}

search_file(current_dir,filename);

if (!search_flag)
printf("Not found this(%s) file!\n",filename);

return 0;
}

【jixingzhong】:
VC 下的:

long handle;
struct _finddata_t filestruct;  
char path_search[_MAX_PATH];
handle = _findfirst("目录",&filestruct);
if((handle == -1)) return;
if( ::GetFileAttributes(filestruct.name)& FILE_ATTRIBUTE_DIRECTORY )
{
if( filestruct.name[0] != '.' )
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else
{
if( !stricmp(filestruct.name, szFilename) )
{
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
MessageBox(path_search);
}
}
while(!(_findnext(handle,&filestruct)))
{
  if( ::GetFileAttributes(filestruct.name) &FILE_ATTRIBUTE_DIRECTORY )
{
if(*filestruct.name != '.')
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
else
{
if(!stricmp(filestruct.name,szFilename))
{
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
MessageBox(path_search);
}
}
}
_findclose(handle);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
洛阳火车站到洛阳关林的钢厂怎么坐公车去?钢厂目前是否分为三个小... 李永昌的《桃花运》 歌词 失眠特效药有哪些 失眠有什么快速特效药 长期失眠用什么药最好?失眠治疗特效药有哪些 失眠怎么办办,有没有什么特效药 本人严重失眠,有特效药吗? 长期焦虑失眠怎么办?有没有好的特效药? 离婚了,小孩抚养费对方拖着不给,玩失踪,怎么办? 小孩抚养费前夫每月都拖着不给怎么解决 怎么用C语言编程遍历文件夹下所有文件名 如何用C实现遍历文件夹 怎么用C语言遍历文件啊? 曲面屏opporeno6 C# 遍历文件夹下所有子文件夹中的文件,得到文件名 C语言遍历目录中的文件 微信查找附近的人在网络畅通的情况下为什么老是在搜索中? 冰箱咕噜响有水声怎么回事? 电冰箱经常咕噜嘎啦,咕噜嘎啦的响,每次响十声左右,过一会,又重复的响... 海尔冰箱为什么老咕噜咕噜响,而且响的时间特别长 这是怎么回事啊_百度... 上海诺达佳自动化技术有限公司怎么样? 上海哪有java培训或者自动化测试培训的(达内太贵了) 上海工业自动化仪表研究院 在上海如何 上海自动化仪器仪表研究院检测所怎么样 现在软件测试这个行业是个香饽饽,上海鲁德对自动化测试培训这一块不知道效果如何,有了解的吗 上海工业自动化仪表研究院有限公司怎么样? 捷列(上海)自动化科技有限公司怎么样? 上海真可行自动化设备有限公司怎么样? 上海昕卫自动化测控技术有限公司怎么样? 上海自动化检测有没有专业做标签扫描系统检测的? C语言:如何遍历指定的文件夹(可以包括子文件夹)中的每一个文件名 c语言遍历d盘下有多少个文件? c语言遍历d盘下有多少个文件? 请教C语言如何遍历文本文件,比较取得其中想要的内容?(高分悬赏) 请教C语言如何遍历文本文件,比较取得其中想要的内容?(高分悬赏) 在windows下 怎么用c语言遍历文件夹?要用纯c的 在windows下 怎么用c语言遍历文件夹?要用纯c的 C语言遍历所有文件的函数! C语言遍历所有文件的函数! C语言如何实现遍历文件夹下的所有txt文件并在文件中搜索字符串 C语言如何遍历目录 (C++也可以) findfirst findnext怎么用? C语言如何遍历目录 (C++也可以) findfirst findnext怎么用? 如何用C代码遍历整个windows文件夹查找某个特定文件? 如何用C代码遍历整个windows文件夹查找某个特定文件? windows下使用C/C++怎么遍历目录并读取目录下的文件列表 windows下使用C/C++怎么遍历目录并读取目录下的文件列表 用C语言编出遍历出某个目录以及其子目录下所有以TXT为扩展名的文本文件... 用C语言编出遍历出某个目录以及其子目录下所有以TXT为扩展名的文本文件 C语言遍历目录 C语言遍历目录