学习笔记:linuxc第六章下

本章讲述了一些基本的文件操作,文件主要包含两方面的内容:(1)文件本身包含的数据,(2)文件属性。下面,我简述一下文件属性操作,和在学习、练习过程觉得应该注意的地方。
文件属性操作
1.获取文件属性:在shell下直接用命令ls获取文件属性在程序中需要用到stat/fstat/lstat函数,这三个函数都是用来获取文件信息,区别见下面函数声明及其注释

/*获取filename指定的文件名的信息*/
int stat(const char *filename, struct stat *buf);

/*获取描述符filedes指定文件名信息*/
int fstat(int filedes, struct stat *buf);

/*对于符号链接文件,lstat返回链接文件本身信息,stat返回链接指向的文件信息*/
int lstat(const char *file_name, struct stat *buf);

2.设置文件属性:
同样在shell下可以使用一些命令,如chmod来完成。在程序中通过一系列函数来修改文件属性,如chmod/fchmod等。这里主要介绍一下umask函数。
umask函数用于设置文件创建时使用的屏蔽字,并返回以前的值(前提:没有出错)
在进程创建一个新文件或者目录时,新文件的实际存取权限是mode与umask按照mode&~umask运算以后的结果,umask函数用来修改进程的umask,umask函数的参数可以直接取值,也可以系统调用。具体应用请参考代码及注释。

umask(0);                 //不屏蔽任何权限
umask(S_IRWXO);           //屏蔽其他用户的所有权限。

以下是我在通过函数实现自己简化版ls命令的一些代码。
首先,ls命令好多地方都用到了排序功能。以下是我用快排通过排序时间,来对文件名的排序,这样,在获取文件属性的时候就可以直接传文件名为参数实现 -t 功能。
详情请参考代码:

 /*file_name 代表文件名,time代表时间,left最左边,right最右边*/
void sort_time( char file_name[256][PATH_MAX+1], int left, int right,char time[256][PATH_MAX] )
{
    int i=left;
    int j=right;
    char key[80];     //时间标识
    char key1[80];  //文件名标识

    strcpy(key,time[left]);    
    strcpy(key1,file_name[left]); 

    if(left >= right){
        return ;
    }
    while( i<j ){
        while( i<j && strcmp(key, time[j]) <0){
            j--;
        }
        strcpy(time[i],time[j]);
        strcpy(file_name[i], file_name[j]);

        while(i<j && strcmp(time[i], key) <=0){
            i++;
        }
        strcpy(time[j],time[i]);
        strcpy(file_name[j], file_name[i]);
    }
    strcpy(time[i], key);
    strcpy(file_name[i],key1);
    sort_time(file_name, left, i-1, time);   // 递归左边
    sort_time(file_name, i+1, right, time);   //递归右边
}

在ls命令中有一个很重要的功能-R,这里简要说明一下,详情请参考代码及注释

void print_dir(char *path)                   //接收路径
{
    DIR                *dir=NULL;       
    struct dirent      *ptr;
    char               filenames[2000];  //保存路径名
    int                len=0;            //获取路径长度(按字节)
    len=strlen(path);
    dir=opendir(path);                   //打开目录
    if(dir==NULL){                       //判断是否成功打开
       return ;
    }
    while((ptr=readdir(dir)) !=NULL )   //货期该目录下的所有文件
    {
            /*保持路径正确*/
        strncpy(filenames, path, len); 
        filenames[len]='\0';
        strcat(filenames, ptr->d_name);
        filenames[len+strlen(ptr->d_name)]='\0';

        if(ptr->d_type==8){         //=8代表是文件,直接输出文件名    
            printf("%s  \n",ptr->d_name);
            }

        else if(ptr->d_type == 4){ //=4代表是目录,递归获取该目录下所有文件信息
            printf("%s  \n",ptr->d_name);
            print_dir(filenames);
        }
    }
}

有个很重要的步骤:遍 历 必须遍历到所有目录下的所有文件,输出目录名及文件名。主要就是一个递归的过程,一层一层下去直到找到的是一个文件再逐层返回。

以上,就是我学习linuxc第六章的一些笔记,觉得比较重要,容易出错的地方也很多,希望看到这篇博客的人如果觉得我有哪些地方写得不好或者出错了,能给我回复一下下,小女子感激不尽!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值