文件属性及其目录操作

1、文件属性的操作

我们可以使用这几个函数获取到文件状态信息

SYNOPSIS

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

 

       int stat(const char *path, struct stat *buf);   //第一个参数是我们所需要查看的文件路径,然后会将文件的信息保存到buf

 

 

           struct stat {

               dev_t     st_dev;     /* ID of device containing file 包含了文件的设备号 */

               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 用户ID  */

               gid_t     st_gid;     /* group ID of owner 组所属的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 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  最后修改的时间  */

           };

 

   判断文件类型的一些宏,

   

   char buffer[512];

 

           S_ISREG(m)  is it a regular file? 表示这个文件是不是一个普通的文件

           sprintf();

           S_ISDIR(m)  directory?        表示这个是不是一个目录

 

           S_ISCHR(m)  character device? 判断这个是不是一个字符设备

 

           S_ISBLK(m)  block device? 判断这个是不是一个块设备

 

           S_ISFIFO(m) FIFO (named pipe)? 判断这个是不是一个管道

 

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)   判断这个是不是一个符号链接

 

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.) 判断这个是不是一个socket

 

 

返回值,当返回0的时候表示读取这个文件的状态成功,-1的时候,表示出错,错误码可以打印出来perror。

 

 

 

       int fstat(int fd, struct stat *buf);   //通过fd的方式来查看文件的属性,fd表示文件描述符,代表一个打开的文件。

       int lstat(const char *path, struct stat *buf);    //l代表是一个链接,是用来获取符号链接本身的属性,stat,返回的是的符号链接所指向的这个文件的属性。

 

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <time.h>

 

int main(int argc , char *argv[])

{

int r;

struct stat st;

 

r = stat(argv[1],&st);

if(r < 0)

{

perror("stat error");

return -1;

}

 

char buffer[512];

r = 0;

char ch;

if(S_ISREG(st.st_mode))//判断文件类型

{

ch = '-';

r += sprintf(buffer + r,"%c",ch);

}

    else if(S_ISDIR(st.st_mode))

{

ch = 'D';

r += sprintf(buffer + r,"%c",ch);

}

else if(S_ISCHR(st.st_mode))

{

ch = 'c';

r += sprintf(buffer + r,"%c",ch);

}

 

 

 

if(st.st_mode & S_IRUSR)//判断文件属性,用户,用户组和其他的可读,可写,可执行权限,下面的都为owner的权限;

{

ch = 'R';

r += sprintf(buffer+r,"%c",ch);

}else{

ch = '-';

r += sprintf(buffer+r,"%c",ch);

}

 

if(st.st_mode & S_IWUSR)//对于这些宏可以用 man 2 stat查看

{

ch = 'W';

r += sprintf(buffer+r,"%c",ch);

}else{

ch = '-';

r += sprintf(buffer+r,"%c",ch);

}

 

 

if(st.st_mode & S_IXUSR)

{

ch = 'X';

r += sprintf(buffer+r,"%c",ch);

}else{

ch = '-';

r += sprintf(buffer+r,"%c",ch);

}

 

 

if(st.st_mode & S_IRGRP)

{

ch = 'R';

r += sprintf(buffer+r,"%c",ch);

}else{

ch = '-';

r += sprintf(buffer+r,"%c  ",ch);

}

 

 

r += sprintf(buffer+r," %s ", ctime(&st.st_mtime ) );//打印最后修改的时间;

 

 

printf("%s\n",buffer);

}

 

 

 

 

2、目录的操作

先打开对应的目录,然后再去读取目录内的信息

 

SYNOPSIS

       #include <sys/types.h>

       #include <dirent.h>

 

       DIR *opendir(const char *name);

       DIR *fdopendir(int fd);

 

d调用这个函数可以打开对应的一个目录,然后返回目录的目录项,再调用这个函数 readdir() 去遍历目录里面的内容。

如果成功,返回的是一个目录项,如果失败,返回的是一个NULL,并且我们可以把错误码打印出来。

 

 

1、成功打开

2、readdir()去遍历这个目录下面所有的目录项。

 

 

           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  文件或者目录的名字 */

           };

 

 

 

VIM 的一些命令的使用

在命令模式下,按v 进入可视模式,按上下左右来选择文本,

d-> 代表剪切,

y-> 代表复制

p-> 代表粘贴,

u-> 代表撤销

 

#include <stdio.h>

#include <sys/types.h>

#include <dirent.h>

#include <unistd.h>

#include <sys/stat.h>

 

int dirsize(char *pathname)

{

DIR *dir;

char filename[512];

int size=0;

dir = opendir(pathname);

if(dir == NULL)

{

perror("opend dir fail");

return -1;

}

 

struct dirent *dirp = NULL;

//遍历这个目录像,循环一次,就指向下一个目录相,读完之后指针就变为空退出循环

while(dirp = readdir(dir))

{

if( strcmp(dirp->d_name,".") == 0 || strcmp(dirp->d_name,"..") ==0 )

{

continue;

}

sprintf(filename,"%s/%s",pathname,dirp->d_name);

printf("%s\n",filename);

struct stat st;

stat(filename,&st);

 

if(S_ISDIR(st.st_mode))

{

size += dirsize(filename);

}

else

size += st.st_size;

// printf("size=%d\n",size);

 

 

 

}

 

closedir(dir);

return size;

}

 

 

 

int main(int argc , char * argv[])

{

int size;

size = dirsize(argv[1]);

printf("dir size %d\n",size);

return 0;

}

 

 

  1. 如何获取到开发板触摸屏的坐标值

(自己的理解:触摸屏幕时,相应的信息会通过事件的方式传入/dev/input/event0然后再读到input_event结构体中进行查看,判断)

 

在Linux系统里面,对触摸屏划分为一种输入设备,就是一种input设备,通过事件的方式来上报对应的坐标,或者键值。

通过input_event结构体上报,这个结构体在 /usr/include/linux/input.h文件里面

 

struct input_event {

     struct timeval time; //时间,事件发生的事件

     __u16 type; //事件的类型是什么,

//#define EV_SYN          0x00  事件同步信号

//#define EV_KEY          0x01  说明上报的事件是一种键盘输入

//#define EV_REL          0x02  鼠标事件

//#define EV_ABS          0x03  触摸屏事件

 

     __u16 code; //比如说,上报的类型是一个键盘事件的话,那这里对应的键值  #define KEY_ESC         1

//比如说,上报的事件是一个触摸屏事件的话,上报的是#define ABS_Y  0x01   #define ABS_X   0x00

 

     __s32 value; //比如说,上报的事件是键盘事件的话,value=1 表示是按下,value=0的话表示弹起的状态。

//比如说,上报的事件是触摸屏事件的话,表示是坐标值。

 

 

#include <stdio.h>

#include <fcntl.h>

#include <linux/input.h>

 

int main()

{

int fdts;

struct input_event ts;

 

fdts = open("/dev/input/event0",O_RDONLY);

if(fdts < 0)

{

perror("ts open fail");

return -1;

}

 

while(1)

{

read(fdts,&ts,sizeof(struct input_event));

if(ts.type == EV_ABS)

{

if(ts.code == ABS_X)

{

printf("x=%d\n",ts.value);

}

else if(ts.code == ABS_Y)

{

printf("y=%d\n",ts.value);

}

}

}

 

close(fdts);

return 0;

}

 

作业:

1、实现点击屏幕左边和右边的区域,实现上一张,下一张的打印。

2、找到指定目录的图片文件。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值