c++如何获取一个目录下的所有文件名,目录名不要,谢谢

winter_1988 2016-08-13 11:02:28
c++如何获取一个目录下的所有文件名,目录名不要
并且把这些文件名(含绝对路径) 保存到数组
谢谢
...全文
589 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsonnode 2016-08-20
  • 打赏
  • 举报
回复
引用 12 楼 weicjf 的回复:
UNIX环境高级编程,基本功! 也可以用boost库#include <boost/filesystem.hpp>
Linux环境下 #include <iostream> #include <string> #include <vector> #include <dirent.h> using namespace std; int main() { string path = "/home/project"; vector<string> files; struct dirent *pDir; DIR *dp; if((dp = opendir(path.c_str())) == NULL) { cout<<"Open Dir failed!"<<endl; return -1; } while( (pDir = readdir(dp)) != NULL) { string filename(pDir->d_name); if(filename == "." || filename == "..") continue; files.push_back(filename); } size_t len = files.size(); for(size_t i = 0 ; i < len ;++i) { cout<<files[i]<<endl; } return 0; }
jsonnode 2016-08-20
  • 打赏
  • 举报
回复
UNIX环境高级编程,基本功! 也可以用boost库#include <boost/filesystem.hpp>
赵4老师 2016-08-17
  • 打赏
  • 举报
回复
引用 10 楼 u012483962 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:]
谢谢赵老师,问题是如何把ls的结果保存到C的数组呢?[/quote] 使用比如 ls ...>out.txt重定向ls的输出到out.txt文件 然后使用fopen、fgets、fclose读文件保存到数组。 参考下面:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

winter_1988 2016-08-17
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
谢谢赵老师,问题是如何把ls的结果保存到C的数组呢?
赵4老师 2016-08-15
  • 打赏
  • 举报
回复
ls(list) 功能说明:列出目录内容。 语  法:ls [-1aAbBcCdDfFgGhHiklLmnNopqQrRsStuUvxX][-I <范本样式>][-T <跳格字数>][-w <每列字符数>][--block-size=<区块大小>][--color=<使用时机>][--format=<列表格式>][--full-time][--help][--indicator-style=<标注样式>][--quoting-style=<引号样式>][--show-control-chars][--sort=<排序方式>][--time=<时间戳记>][--version][文件或目录...] 补充说明:执行ls指令可列出目录的内容,包括文件和子目录的名称。 参  数: -1 每列仅显示一个文件或目录名称。 -a或--all 下所有文件和目录。 -A或--almost-all 显示所有文件和目录,但不显示现行目录和上层目录。 -b或--escape 显示脱离字符。 -B或--ignore-backups 忽略备份文件和目录。 -c 以更改时间排序,显示文件和目录。 -C 以又上至下,从左到右的直行方式显示文件和目录名称。 -d或--directory 显示目录名称而非其内容。 -D或--dired 用Emacs的模式产生文件和目录列表。 -f 此参数的效果和同时指定"aU"参数相同,并关闭"lst"参数的效果。 -F或--classify 在执行文件,目录,Socket,符号连接,管道名称后面,各自加上"*","/","=","@","|"号。 -g 次参数将忽略不予处理。 -G或--no-group 不显示群组名称。 -h或--human-readable 用"K","M","G"来显示文件和目录的大小。 -H或--si 此参数的效果和指定"-h"参数类似,但计算单位是1000Bytes而非1024Bytes。 -i或--inode 显示文件和目录的inode编号。 -I<范本样式>或--ignore=<范本样式> 不显示符合范本样式的文件或目录名称。 -k或--kilobytes 此参数的效果和指定"block-size=1024"参数相同。 -l 使用详细格式列表。 -L或--dereference 如遇到性质为符号连接的文件或目录,直接列出该连接所指向的原始文件或目录。 -m 用","号区隔每个文件和目录的名称。 -n或--numeric-uid-gid 以用户识别码和群组识别码替代其名称。 -N或--literal 直接列出文件和目录名称,包括控制字符。 -o 此参数的效果和指定"-l" 参数类似,但不列出群组名称或识别码。 -p或--file-type 此参数的效果和指定"-F"参数类似,但不会在执行文件名称后面加上"*"号。 -q或--hide-control-chars 用"?"号取代控制字符,列出文件和目录名称。 -Q或--quote-name 把文件和目录名称以""号标示起来。 -r或--reverse 反向排序。 -R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。 -s或--size 显示文件和目录的大小,以区块为单位。 -S 用文件和目录的大小排序。 -t 用文件和目录的更改时间排序。 -T<跳格字符>或--tabsize=<跳格字数> 设置跳格字符所对应的空白字符数。 -u 以最后存取时间排序,显示文件和目录。 -U 列出文件和目录名称时不予排序。 -v 文件和目录的名称列表以版本进行排序。 -w<每列字符数>或--width=<每列字符数> 设置每列的最大字符数。 -x 以从左到右,由上至下的横列方式显示文件和目录名称。 -X 以文件和目录的最后一个扩展名排序。 --block-size=<区块大小> 指定存放文件的区块大小。 --color=<列表格式> 培植文件和目录的列表格式。 --full-time 列出完整的日期与时间。 --help 在线帮助。 --indicator-style=<标注样式> 在文件和目录等名称后面加上标注,易于辨识该名称所属的类型。 --quoting-syte=<引号样式> 把文件和目录名称以指定的引号样式标示起来。 --show-control-chars 在文件和目录列表时,使用控制字符。 --sort=<排序方式> 配置文件和目录列表的排序方式。 --time=<时间戳记> 用指定的时间戳记取代更改时间。 --version 显示版本信息。
赵4老师 2016-08-15
  • 打赏
  • 举报
回复
Linux使用ls命令代替dir命令
wlkeagle 2016-08-14
  • 打赏
  • 举报
回复
楼主可以看看 opendir / readdir / closedir 函数,自己封装成满足需要的
paschen 版主 2016-08-14
  • 打赏
  • 举报
回复
10km 2016-08-14
  • 打赏
  • 举报
回复
引用 4 楼 10km 的回复:
如果用c++11写的话,参见本人博客:《C++11:for_each_file遍历目录处理文件》
windows/linux通用,vc/gcc编译通过
10km 2016-08-14
  • 打赏
  • 举报
回复
如果用c++11写的话,参见本人博客:《C++11:for_each_file遍历目录处理文件》
winter_1988 2016-08-13
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
谢谢赵老师,我用的是LINUX,又不能用winexec,另外你的命令的结果如何保存到 C/C++的数组里啊? 而且我要的是文件,目录不要
赵4老师 2016-08-13
  • 打赏
  • 举报
回复
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。 如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
ooolinux 2016-08-13
  • 打赏
  • 举报
回复
findfirst、findnext、findclose 参考: http://blog.sina.com.cn/s/blog_6f611c3001018tne.html

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧