linux 获取文件夹下文件信息,linux下获取文件夹下子文件列表
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下获取文件夹下子文件列表相关推荐
- linux服务器怎么查看cpu配置信息,linux服务器cpu信息查看详解
在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...
- linux在屏幕上显示问候信息,linux系统版本查看
一.查看内核版本命令: 1) [root@SOR_SYS ~]# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012.b ...
- h命令可以获取mysql客户端的帮助信息_如何获取MySQL帮助信息
在开发或测试环境在碰到MySQL相关故障时,大多数朋友可能会通过论坛发帖,QQ群讨论方式来获取帮助.该方式是获取帮助的有效途径之一.然而如果在生产环境,在没有网络的环境下,这些方式就无助于问题的解决. ...
- android中获取应用程序(包)的信息,Android中获取应用程序(包)的信息PackageManager的使用(一).doc...
Android中获取应用程序(包)的信息PackageManager的使用(一) 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等 ...
- linux查看当前igb的版本信息,Linux下查看网卡驱动和版本信息
Linux下查看网卡驱动和版本信息 查看网卡生产厂商和信号 查看基本信息:lspci 查看详细信息:lspci -vvv # 3个小写的v 查看网卡信息:lspci | grep Ethernet ...
- linux系统怎么查看raid卡信息,LINUX下查SCSI卡、RAID卡信息的命令
Linux下查SCSI卡.RAID卡信息的命令 shell#cat /proc/scsi/scsi shell#/sbin/lspci shell#/usr/sbin/dmidecode 例: [ro ...
- linux那个目录存放用户密码信息,linux试题及答案
选择题1 1.在创建Linux分区时,一定要创建()两个分区 A. FAT/NTFS B. FAT/SW AP C. NTFS/SW AP D.SW AP/根分区 2.在Red Hat Linux 9 ...
- linux查看链路聚合的协商信息,Linux 链路聚合
链路聚合 链路聚合:本实验可以自己通过给虚拟机添加两张网卡自行实验,不需要实验脚本,自己配置网卡接口可能会是eth1和eth2 题目要求: 此链路使用借口eno1和eno2 此链路在一个接口失效时仍能 ...
- linux 显示套接字统计信息,Linux 命令 - ss: 查看套接字统计信息
命令格式 ss [options] [ FILTER ] 命令参数 -h, --help 显示帮助信息. -V, --version 显示版本信息. -n, --numeric 不解析服务名称. -r ...
- linux 怎么查看go版本,如何在Linux下查看版本信息
Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然. 1.# uname -a (Linux查看版本当前操作系统内核信息) Linux ...
最新文章
- 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...
- python 学习之 PythonAdvance2
- CaptCha的现状与未来
- 谷歌已推送 Android Q Beta 1
- snort简介以及在Ubuntu下的安装
- Hadoop权威指南(中文版,第2版)【分享】
- 16个 Redis 常见使用场景,面试有内容聊啦
- 软件测试测试工具总结
- NOIP2017普及组复赛 解题分析
- 李宏毅 || 机器学习笔记一
- 手机怎么修改浏览器的html,手机设置默认浏览器
- ele input事件 输入后0.5秒触发
- 数据库课程设计-KTV点歌系统(VB.net 窗体,MySQL5.5)
- html表单验证邮箱表达式,Javascript正则表达式实现表单验证
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
- special effects - 星空宇宙背景特效
- Axure的入门到精通(一)——基础使用及常用快捷键
- 6-3 BMI计算(类与对象) (10分)
- 和平精英苹果系统显示服务器暂未开放,和平精英苹果更新不了 苹果无法进行版本更新如何解决...
- 亚马逊测评需要注意的事项