linux编程复习1——文件与IO(1)

1,实现文件拷贝复习文件的打开
2, 关于lseek
3,实现最简单的一个ls
4,stat结构体及简单示例

的代码简单实现与整理:

1实现文件拷贝复习文件的打开

  1 #include<unistd.h>
  2 #include<sys/types.h>
  3 #include<sys/stat.h>
  4 #include<fcntl.h>
  5 #include<stdlib.h>
  6 #include<stdio.h>
  7 #include<errno.h>
  8 #include<string.h>
  9 
 10 #define ERR_EXIT(m)\
 11         do\
 12         {\
 13             perror(m);\
 14             exit(EXIT_FAILURE);\
 15         }while(0)
 16 
 17 int main(int argc, char *argv[])
 18 {
 19     int infd;
 20     int outfd;
 21     if(argc != 3)
 22     {
 23         fprintf(stderr, "Usage %s src_dest\n", argv[0]);
 24         exit(EXIT_FAILURE);
 25     }
 26     infd = open(argv[1],O_RDONLY);
 27     if(infd == -1)
 28             ERR_EXIT("open src error");
 29     if((outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1)
 31             ERR_EXIT("open dest error");
 32 	int nread;
 33     char buf[1024];
 34     while(nread = (read(infd, buf, 1024))>0)
 35             write(outfd, buf, nread);
 36     close(infd);
 37     close(outfd);
 38 
 39     return 0;
 40 }


实现拷贝:读取infd所指向的内容,写入到outfd所指向的内容
首先设置文件的读写模式:将第一个文件的内容设置只读模式,第二个文件设置只写模式,如果原来存在要截0不存在就644创建
再将文件读写与缓冲区配合交互即可

实现👇
在这里插入图片描述


lseek

lseek 主要作用是移动文件读写指针,因此还有以下两个作用
1.拓展文件,不过一定要一次写的操作。迅雷等下载工具在下载文件时候先扩展一个空间,然后再下载的。
2.获取文件大小

lseek(fd, 0, SEEK_CUR); 从文件当前位置进行偏移,偏移n个指针,返回的是偏移量,如例偏移量就是当前指针所在的位置,因为偏移了0个,可以返回当前文件的偏移量第二个参数是相对于第三个参数的偏移量,第三个参数是基准

lseek返回例子👇

//...
int main(void)
 18 {
 19     int fd;
 20     fd = open("test.txt", O_RDONLY);
 21     if(fd == -1)
 22             ERR_EXIT("open error");
 23     char buf[1024] = {0};
 24     int ret = read(fd, buf, 5);
 25     if(ret == -1)
 26             ERR_EXIT("read error");
 27 
 28     ret = lseek(fd, 0, SEEK_CUR);
 29     if(ret == -1)
 30             ERR_EXIT("lseek error");
 31     printf("current offset = %d\n_", ret);
 32 
 33     return 0;

返回结果👇文件偏移量,test文件内容是ABCDE,下标索引从0开始,现在的文件读写指针就到E后面了
在这里插入图片描述


实现简单的ls

  1. 打开一个目录L:DIR* opendir(char *pathname);返回一个DIR指针
  2. 访问指定目录中下一个连接的细节struct dirent* readdir(DIR* dirptr);
    目录结构体信息
    在这里插入图片描述3. 关闭一个已经打开的目录int closedir(DIR *dirptr);

实现👇

 18  int main(int argc, char *argv[])
 19 {
 20 
 21     DIR *dir = opendir(".");
 22     struct dirent *de;
 23     while((de = readdir(dir)) != NULL)
 24     {
 25             printf("%s\n_", de->d_name);
 26 
 27     }
 28     closedir(dir);
 29     exit(EXIT_SUCCESS);
 30     return 0;
 31 
-- INSERT -- 

结果👇将当前文件夹所有文件都显示出来了
在这里插入图片描述


stat功能:读取文件元数据
在这里插入图片描述在前后端交互中,还可以用stat的st_mode判断文件类型mode_t mode = buf.st_mode; //struct stat buf

#define MAJOR(a) (int)((unsigned short)a >> 8)
 18 #define MINOR(a) (int)((unsigned short)a & 0xFF)
 19 int filetype(struct stat *buf)
 20 
 21 int main(int argc, char *argv[])
 22 {
 23         if(argc != 2){
 24                 fprintf(stderr, "Usage %s file\n_", argv[0]);
 25                 exit(EXIT_FAILURE);
 26         }
 27         struct stat sbuf;
 28         printf("Filename:%s\n_", argv[1]);
 29         if(stat(argv[1], &sbuf) == -1)
 30                 ERR_EXIT("stat error");
 31 
 32     printf("File number: major %d, minor %d inode %d\n", MAJOR(sbuf.st_dev),    MINOR(sbuf.st_dev), (int)sbuf.st_ino);
 33     if(filetype(&sbuf)
 34     {
 35             printf("Device number:major %d\n_", MAJOR(sbuf.st_rdev), MINOR(s    buf.st_rdev));
 36 
 37     }
 38     return 0;
 39 }
 int filetype(struct stat* buf)
 41 {
 42     int flag = 0;
 43     printf("Filetype:");
 44     mode_t mode;
 45     mode = buf.st_mode
 46     switch(mode & S_IFMT)
 47     {
 48             case S_IFSTOCK:
 49                 printf("socket\n");
 50                 break;
 51             case S_IFREG:
 52                 printf("reg\n");
 53                 falg = 1;
 54                 break;
 55             //...
 56 
 57     }
 58     return flag;
//233就这么个意思,懒得调试系列

在这里插入图片描述
在这里插入图片描述**stat:**获取链接文件的信息时,具有穿透能力,直接穿越链接文件,获取所被链接文件的信息。
**lstat:**获取链接文件的信息,无穿透能力

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读