Linux系统编程之访问文件夹及其文件属性

1. 文件夹操作:opendir, readdir, closedir

2. 文件属性:lstat

3. 实现功能:获取指定文件夹下所有的文件(使用递归),因此就能计算所有文件大小之类的啦。。。

代码示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>

#define BUF_SIZE	512

static char _get_file_type(mode_t st_mode);
static int _folder_file_read(const char * path);

// read all file of the path
int folder_file_read(const char * path);

//*********** man func for test ************//
int main(int argc, char const *argv[])
{
	int ret;

	if (argc != 2)
	{
		printf("usage: ./a.out path \n");
		return 1;
	}

	ret = folder_file_read(argv[1]);
	if (-1 == ret)
	{
		printf("%s is not a valid dir path!\n", argv[1]);
		return 1;
	}

	return 0;
}

int folder_file_read(const char * path)
{
	int ret;

	ret = _folder_file_read(path);
	if (-1 == ret)
	{
		return -1;
	}
	printf("\n");

	return 0;
}

static int _folder_file_read(const char * path)
{
	DIR *dir;
	struct dirent *entry;
	struct stat st_stat;
	int ret;
	char full_path[BUF_SIZE];
	char type;

	dir = opendir(path);
	if (NULL == dir)
	{
		perror("opendir()");
		ret = -1;
		goto err_opendir;
	}

	while (1)
	{
		entry = readdir(dir);
		if (NULL == entry) //end
		{
			break;
		}

		snprintf(full_path, BUF_SIZE, "%s/%s", path, entry->d_name);
		ret = lstat(full_path, &st_stat);
		if (-1 == ret)
		{
			perror("lstat()");
			goto err_lstat;
		}

		type = _get_file_type(st_stat.st_mode);
		// handle diff type
		if ('d' == type) // dir
		{
			if (0 == strcmp(".", entry->d_name) || 0 == strcmp("..", entry->d_name))
			{
				continue;
			}
			_folder_file_read(full_path); // must be success
		}
		else // else, others
		{
			// do something here
			printf("%s\t", entry->d_name);
		}
	}

	closedir(dir);

	return 0;

err_lstat:
	closedir(dir);
err_opendir:
	return ret;
}

static char _get_file_type(mode_t st_mode)
{
	if (S_ISREG(st_mode))
	{
		return '-';
	}
	if (S_ISDIR(st_mode))
	{
		return 'd';
	}
	if (S_ISCHR(st_mode))
	{
		return 'c';
	}
	if (S_ISBLK(st_mode))
	{
		return 'b';
	}
	if (S_ISFIFO(st_mode))
	{
		return 'p';
	}
	if (S_ISLNK(st_mode))
	{
		return 'l';
	}
	if (S_ISSOCK(st_mode))
	{
		return 's';
	}
	return 0; // no meaning
}

运行结果:

最后:附两个结构体的成员,struct dirent, struct stat st_stat(自己man也行)

struct dirent {
               ino_t          d_ino;       /* inode number */
               off_t          d_off;       /* not an offset; see NOTES */
               unsigned short d_reclen;    /* length of this record */
               unsigned char  d_type;      /* type of file; not supported
                                              by all filesystem types */
               char           d_name[256]; /* filename */
           };
struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links */
               uid_t     st_uid;     /* user ID of owner */
               gid_t     st_gid;     /* group ID of owner */
               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 512B 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 */
           };

Linux系统编程之访问文件夹及其文件属性,布布扣,bubuko.com

时间: 2024-12-18 16:20:49

Linux系统编程之访问文件夹及其文件属性的相关文章

Linux 系统根目录下各个文件夹的作用

原文: https://blog.csdn.net/qq_26941173/article/details/78376760 /bin 系统由很多放置可执行文件的目录,但是bin目录比较特殊.因为bin目录下面放置的是在单用户维护模式下还能被操作的命令 在/bin下面的被root用户和一般的用户所使用,主要有cat.chmod.chown.date.mv.mkdir.cp.bash等. /boot 这个目录主要放置开机能够使用到的文件,包括linux内核文件和开机菜单与开机所以需要的配置文件.

linux 系统统计目录下文件夹的大小

du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory (of directory argum

linux系统常用命令 -设置文件夹读写权限

设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)sudo chmod 666 ××× (每个人都有读和写的权限)sudo chmod 777 ××× (每个人都有读和写以及执行的权限) -R表示包含设置所有子目录

在Linux系统下统计当前文件夹下的文件个数、目录个数

1.统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 如下图: 2.统计文件夹下目录的个数,包括子文件夹里的 ls -lR|grep "^d"|wc -l 如下图: 3.统计当前文件夹下文件的个数 ls -l |grep "^-"|wc -l 如下图: 4.统计当前文件夹下目录的个数 ls -l |grep "^d"|wc -l 如下图: 原文地址:https://www.cnblog

linux系统编程笔记:文件编程

1.创建文件: 创建文件可以使用Linux系统调用create,其原型为:int creat(const char*filename,mode_t mode) filename:你要创建的文件名(包含路径,缺省为在当前路径下创建文件) mode_t:创建模式,表示你创建的文件的权限. S_IRUSR  可读 S_IWUSR  可写 S_IXUSR  可执行 S_IRWXU  可读可写可执行 也可以直接用数字来表示,比如mode_t取0666时表示创建的文件对于文件所有者和文件所有者所在的组以及其

嵌入式 Linux系统编程(二)——文件描述符控制函数fcntl

嵌入式 Linux系统编程(二)--文件描述符控制函数fcntl 由于fcntl函数实在过于灵活和复杂,本文将fcntl函数从文件IO中单独列出来,便于详细解读.函数原型如下: #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); fcntl函数用于控制操作文件描述符fd,对文件描述符的控制操作由cmd控制命令来控制,arg参数为可选参数,是否需要arg参数取决于控制命令

嵌入式 Linux系统编程(一)——文件IO

嵌入式 Linux系统编程(一)--文件IO 一.文件IO概念 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件IO操作.不带缓存的属于直接调用系统调用(system call)的方式,高效完成文件输入输出.它以文件标识符(整型)作为文件唯一性的判断依据.这种操作不是ASCI标准的,与系统有关,移植有一定的问题.而带缓存的是在不带缓存的基础之上封装了一层,维护了一个输入输出缓冲区,使之能跨OS,成为ASCI标准,称为标准IO库.不带缓存的方式频繁进行用户态 和内核

嵌入式 Linux系统编程(五)——目录文件函数

嵌入式 Linux系统编程(五)--目录文件函数 Linux中目录也是文件,目录操作函数为标准IO库函数.主要函数如下: #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); DIR *fdopendir(int fd); 成功返回一个指向目录流的指针,失败返回NULL,并且设置errno全局变量. #include <dirent.h> struct dirent *rea

Linux系统编程_2_文件I/O

这里说的的文件I/O指的是不带缓存的: 1.关于带缓存的IO操作和不带缓存的IO操作,参见另一篇文章: 带缓存IO和不带缓存IO详解 Linux中的文件IO(不带缓存的IO)通常用的有以下几个: open    read    write    lseek   close 2.open的参数 int fd(filename, mode); mode 通常可以是O_RDONLY(只读)  O_WRONLY(只写)  O_RDWR(读写) 必须指定且只能指定一个! 其他的可供选择,可通过或运算添加: