linux下获取文件夹下子文件列表

预置条件:

1、只遍历当前目前,不遍历当前目录的子文件夹

2、根据用户提供的开始时间戳以及持续时间,返回在这个时间区间内被修改过的文件列表。

相关知识:

1、struct dirent结构体。存储目录中的文件信息(文件名、扩展名等等)。

include .h>

struct dirent

{

long d_ino; /* inode number 索引节点号 */

off_t d_off; /* offset to this dirent 在目录文件中的偏移 */

unsigned short d_reclen; /* length of this d_name 文件名长 */

unsigned char d_type; /* the type of d_name 文件类型 */

char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */

}

2、struct stat 结构体。这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。

struct stat

{

dev_t st_dev; /* ID of device containing file -文件所在设备的ID*/

ino_t st_ino; /* inode number -inode节点号*/

mode_t st_mode; /* protection -保护模式?*/

nlink_t st_nlink; /* number of hard links -链向此文件的连接数(硬连接)*/

uid_t st_uid; /* user ID of owner -user id*/

gid_t st_gid; /* group ID of owner - group id*/

dev_t st_rdev; /* device ID (if special file) -设备号,针对设备文件*/

off_t st_size; /* total size, in bytes -文件大小,字节为单位*/

blksize_t st_blksize; /* blocksize for filesystem I/O -系统块的大小*/

blkcnt_t st_blocks; /* number of blocks allocated -文件所占块数*/

time_t st_atime; /* time of last access -最近存取时间*/

time_t st_mtime; /* time of last modification -最近修改时间*/

time_t st_ctime; /* time of last status change - */

};

可以有两种方法来获取一个文件的属性:

1、通过路径:

int stat(const char *path, struct stat *struct_stat);

int lstat(const char *path,struct stat *struct_stat);

两个函数的第一个参数都是文件的路径,第二个参数是struct stat的指针。返回值为0,表示成功执行。

执行失败是,error被自动设置为下面的值:

EBADF: 文件描述词无效

EFAULT: 地址空间不可访问

ELOOP: 遍历路径时遇到太多的符号连接

ENAMETOOLONG:文件路径名太长

ENOENT:路径名的部分组件不存在,或路径名是空字串

ENOMEM:内存不足

ENOTDIR:路径名的部分组件不是目录

这两个方法区别在于stat没有处理字符链接(软链接)的能力,如果一个文件是符号链接,stat会直接返回它所指向的文件的属性;而lstat返回的就是这个符号链接的内容。这里需要说明一下的是软链接和硬链接的含义。我们知道目录在linux中也是一个文件,文件的内容就是这这个目录下面所有文件与inode的对应关系。那么所谓的硬链接就是在某一个目录下面将一个文件名与一个inode关联起来,其实就是添加一条记录!而软链接也叫符号链接更加简单了,这个文件的内容就是一个字符串,这个字符串就是它所链接的文件的绝对或者相对地址。

stat结构体中的st_mode 则定义了下列数种情况:

S_IFMT 0170000 文件类型的位遮罩

S_IFSOCK 0140000 scoket

S_IFLNK 0120000 符号连接

S_IFREG 0100000 一般文件

S_IFBLK 0060000 区块装置

S_IFDIR 0040000 目录

S_IFCHR 0020000 字符装置

S_IFIFO 0010000 先进先出

S_ISUID 04000 文件的(set user-id on execution)位

S_ISGID 02000 文件的(set group-id on execution)位

S_ISVTX 01000 文件的sticky位

S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限

S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限

S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限

S_IRGRP 00040 用户组具可读取权限

S_IWGRP 00020 用户组具可写入权限

S_IXGRP 00010 用户组具可执行权限

S_IROTH 00004 其他用户具可读取权限

S_IWOTH 00002 其他用户具可写入权限

S_IXOTH 00001 其他用户具可执行权限

上述的文件类型在POSIX中定义了检查这些类型的宏定义:

S_ISLNK (st_mode) 判断是否为符号连接

S_ISREG (st_mode) 是否为一般文件

S_ISDIR (st_mode) 是否为目录

S_ISCHR (st_mode) 是否为字符装置文件

S_ISBLK (s3e) 是否为先进先出

S_ISSOCK (st_mode) 是否为socket

3、vector容器。包括vector的排序。

sort 对给定区间所有元素进行排序

stable_sort 对给定区间所有元素进行稳定排序

partial_sort 对给定区间所有元素部分排序

partial_sort_copy 对给定区间复制并排序

nth_element 找出给定区间的某个位置对应的元素

is_sorted 判断一个区间是否已经排好序

partition 使得符合某个条件的元素放在前面

stable_partition 相对稳定的使得符合某个条件的元素放在前面

测试代码

//

// testListDir.cpp

//

//

// Created by jianjian Qi on 9/11/16.

// Copyright © 2016 tgbtgb. All rights reserved.

//

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

class FileInfo

{

public:

char fileName[128]; //文件名

time_t createTime; //创建时间

};

/*

*函数功能 :比较两个文件信息的时间,实现升序

*

*fileLeft :左文件信息

*fileRight :右文件信息

*

*返回值 :如果左文件小于右文件,返回true,否则返回false

*/

bool lessFunction(const FileInfo * fileLeft, const FileInfo * fileRight)

{

return (fileLeft->createTime < fileRight->createTime);

}

/*

*函数功能 :查找给定时间段内修改过的文件列表

*

*dirPath :需要查找的文件夹

*beginTime :文件开始时间

*duration :查找时间区间大小

*vecFileinfo :查找到符合要求的文件,会把文件信息添加到vecFileinfo,用于返回给调用者使用

*

*返回值 : 0 代表成功,非0代表失败

*/

int getDirFileListByTimeRange(char * dirPath, time_t beginTime, time_t duration, vector &vecFileinfo)

{

DIR *dataDir;

struct dirent *ent;

struct stat statbuf;

size_t fileNameLen;

time_t endTime = beginTime + duration;

dataDir = opendir(dirPath);

if (dataDir == NULL)

{

printf("open [%s] error@%s\n", dirPath, strerror(errno));

return -1;

}

while ((ent = readdir(dataDir)) != NULL)

{

if ((ent->d_type & DT_REG) == 0)

{

continue;

}

lstat(ent->d_name,&statbuf);

fileNameLen = strlen(ent->d_name);

if (statbuf.st_ctime >= beginTime && statbuf.st_ctime <= endTime)

{

FileInfo * fileInfo = new FileInfo();

fileInfo->createTime = statbuf.st_ctime;

snprintf(fileInfo->fileName, 128, "%s", ent->d_name);

vecFileinfo.push_back(fileInfo);

}

}

return 0;

}

int main(int argc, char **argv)

{

if (argc != 4)

{

printf("input command param error\n");

return -1;

}

vector vecFileinfo;

if (getDirFileListByTimeRange(argv[1], atol(argv[2]), atol(argv[3]), vecFileinfo) != 0)

{

printf("get dir list error");

return -1;

}

if (vecFileinfo.size() > 0)

{

sort(vecFileinfo.begin(),vecFileinfo.end(),lessFunction);

struct tm *fileDate;

for (int i = 0 ; i < vecFileinfo.size(); i++)

{

FileInfo * fileInfo = (FileInfo *)vecFileinfo[i];

fileDate = localtime(&(fileInfo->createTime));

printf("%04d%02d%02d%02d%02d%02d %s\n",fileDate->tm_year+1900, fileDate->tm_mon+1, fileDate->tm_mday, fileDate->tm_hour, fileDate->tm_min, fileDate->tm_sec,fileInfo->fileName);

delete fileInfo;

fileInfo = NULL;

}

vecFileinfo.clear();

}

else

{

printf("empty\n");

return -1;

}

return 0;

}

编译

g++ testListDir.cpp

运行

#./a.out ~/Desktop/ 1473529951 600

20160911015231 2.ts

20160911015418 1.ts

20160911015605 3.ts

linux 获取文件夹下文件信息,linux下获取文件夹下子文件列表相关推荐

  1. linux服务器怎么查看cpu配置信息,linux服务器cpu信息查看详解

    在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...

  2. linux在屏幕上显示问候信息,linux系统版本查看

    一.查看内核版本命令: 1) [root@SOR_SYS ~]# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012.b ...

  3. h命令可以获取mysql客户端的帮助信息_如何获取MySQL帮助信息

    在开发或测试环境在碰到MySQL相关故障时,大多数朋友可能会通过论坛发帖,QQ群讨论方式来获取帮助.该方式是获取帮助的有效途径之一.然而如果在生产环境,在没有网络的环境下,这些方式就无助于问题的解决. ...

  4. android中获取应用程序(包)的信息,Android中获取应用程序(包)的信息PackageManager的使用(一).doc...

    Android中获取应用程序(包)的信息PackageManager的使用(一) 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等 ...

  5. linux查看当前igb的版本信息,Linux下查看网卡驱动和版本信息

    Linux下查看网卡驱动和版本信息 查看网卡生产厂商和信号 查看基本信息:lspci 查看详细信息:lspci -vvv  # 3个小写的v 查看网卡信息:lspci | grep Ethernet ...

  6. linux系统怎么查看raid卡信息,LINUX下查SCSI卡、RAID卡信息的命令

    Linux下查SCSI卡.RAID卡信息的命令 shell#cat /proc/scsi/scsi shell#/sbin/lspci shell#/usr/sbin/dmidecode 例: [ro ...

  7. linux那个目录存放用户密码信息,linux试题及答案

    选择题1 1.在创建Linux分区时,一定要创建()两个分区 A. FAT/NTFS B. FAT/SW AP C. NTFS/SW AP D.SW AP/根分区 2.在Red Hat Linux 9 ...

  8. linux查看链路聚合的协商信息,Linux 链路聚合

    链路聚合 链路聚合:本实验可以自己通过给虚拟机添加两张网卡自行实验,不需要实验脚本,自己配置网卡接口可能会是eth1和eth2 题目要求: 此链路使用借口eno1和eno2 此链路在一个接口失效时仍能 ...

  9. linux 显示套接字统计信息,Linux 命令 - ss: 查看套接字统计信息

    命令格式 ss [options] [ FILTER ] 命令参数 -h, --help 显示帮助信息. -V, --version 显示版本信息. -n, --numeric 不解析服务名称. -r ...

  10. linux 怎么查看go版本,如何在Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a   (Linux查看版本当前操作系统内核信息) Linux ...

最新文章

  1. 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...
  2. python 学习之 PythonAdvance2
  3. CaptCha的现状与未来
  4. 谷歌已推送 Android Q Beta 1
  5. snort简介以及在Ubuntu下的安装
  6. Hadoop权威指南(中文版,第2版)【分享】
  7. 16个 Redis 常见使用场景,面试有内容聊啦
  8. 软件测试测试工具总结
  9. NOIP2017普及组复赛 解题分析
  10. 李宏毅 || 机器学习笔记一
  11. 手机怎么修改浏览器的html,手机设置默认浏览器
  12. ele input事件 输入后0.5秒触发
  13. 数据库课程设计-KTV点歌系统(VB.net 窗体,MySQL5.5)
  14. html表单验证邮箱表达式,Javascript正则表达式实现表单验证
  15. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
  16. special effects - 星空宇宙背景特效
  17. Axure的入门到精通(一)——基础使用及常用快捷键
  18. 6-3 BMI计算(类与对象) (10分)
  19. 和平精英苹果系统显示服务器暂未开放,和平精英苹果更新不了 苹果无法进行版本更新如何解决...
  20. 亚马逊测评需要注意的事项

热门文章

  1. outlook 设置 YAHOO.COM.CN信箱
  2. 聚焦高素质技术技能人才培养 好程序员“育人有方”
  3. WebRequest
  4. 计算机病毒危害性分析,计算机病毒的毒性暨危害性分析系统
  5. Delphi : kbmMemTable关于内存表的使用
  6. Python request爬取华为P30手机京东评论
  7. Adobe CEP插件面板结构
  8. 2点间距离公式(Java)
  9. IPv6与IPv4,IPv6普及难的原因
  10. IDEA Maven SpringMVC中使用thyme leaf