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;
}
- 如何获取到开发板触摸屏的坐标值
(自己的理解:触摸屏幕时,相应的信息会通过事件的方式传入/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、找到指定目录的图片文件。