IO进程线程,文件与目录,实现linux任意目录下ls -la

注意文件的名字、路径是如何输入的。

函数opendir打开目录,struct dirent,struct stat这些结构体的含义。

readdir()函数是一个用于读取目录内容的系统调用或库函数,在类Unix操作系统中(如Linux)广泛使用。它用于遍历目录,并逐个获取目录中的条目(文件和子目录)。

lstat和stat是用于获取文件信息的系统调用,主要在处理符号链接时存在差异。以下是它们之间的主要区别:

  1. 处理符号链接:

lstat:当使用lstat函数获取一个符号链接的信息时,它返回的是符号链接本身的信息,而不是链接所指向文件的信息。这使得你能够查看链接本身的属性,而不用跟随链接指向的文件。

stat:当使用stat函数获取一个符号链接的信息时,它会自动跟随链接,返回链接指向的文件的信息,而不是链接本身的信息。

  1. 跟随链接:

lstat:对于符号链接,lstat不会自动跟随链接,它会返回链接本身的属性,包括链接指向的路径。

stat:对于符号链接,stat会自动跟随链接,返回链接指向的文件的属性。

对于符号链接,`lstat`返回了链接本身的信息,而`stat`返回了链接指向的文件的信息。

cpp 复制代码
/*===============================================
*   文件名称:stat.c
*   创 建 者:WM
*   创建日期:2023年08月24日
*   描    述:文件目录下除了隐藏文件查看
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<dirent.h>
int main(int argc, char *argv[])
{ 
    char path[100]={0};
    if(2!=argc)
    {
        printf("error\n");
        return -1;
    }
 
    DIR * dirp=opendir(argv[1]);//获取所有的目录下的文件名
    struct dirent *a;//接收
     strcpy(path,argv[1]);
    while (NULL!=(a=readdir(dirp)))//从第一个文件名开始遍历到最后。
    {
       struct stat st;
           strcpy(path,argv[1]);
           strcat(path,"/");
           strcat(path,a->d_name);
        if(a->d_name[0]=='.')//去除隐藏文件
           continue;
    lstat(path,&st);//链接文件读取

    if(S_ISREG(st.st_mode))//判断文件类型
        printf("-");
    else if (S_ISDIR(st.st_mode))
        printf("d");
    else if(S_ISLNK(st.st_mode))
        printf("l");

    for (  int i=8; i >= 0; i-=3)//查看文件的权限
    {
        if(st.st_mode & 1<<i)
            printf("r");
        else
            printf("-");
        if(st.st_mode&1<<(i-1))
            printf("w");
        else
            printf("-");
        if(st.st_mode&1<<(i-2))
            printf("x");
        else
            printf("-");
    }
    //链接数
    printf(" %ld",st.st_nlink);
    //用户名
    struct passwd *pw=getpwuid(st.st_uid);
    printf(" %s ",pw->pw_name);
    //用户组名
    struct group *gr =getgrgid(st.st_gid);
    printf( "%s",gr->gr_name);
    //大小
    printf(" %ld",st.st_size);
    //去除换行
    char arr[100]={0};
    strcpy(arr,ctime(&st.st_mtime));
    if(arr[strlen(arr)-1]=='\n')
      arr[strlen(arr)-1]='\0';
    printf(" %s ",arr);

    printf(" %s ",a->d_name);
    puts("");
    }
    return 0;
} 
相关推荐
机器人零零壹2 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
ZhengEnCi5 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是6 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
vibecode6 小时前
网站服务器失去响应怎么解决?我把连接超时和读超时这两段计时拆开跑了一遍
运维·服务器
罗西的思考6 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
工业一体机老司机7 小时前
Docker部署工控机采集服务 Compose编排与开机自启
运维·docker·容器
迪康Defender7 小时前
终端供应链安全:应用白名单与软件正版化检测落地|终端安全治理实践
运维·服务器·网络·安全·web安全·自动化·运维开发
lzx_0028 小时前
Linux 进程(二) 深入理解进程
linux
沫璃染墨8 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
温暖小土8 小时前
在 CentOS 上安装 Redis Stack
linux·redis·centos