學習筆記: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第六章的一些筆記,覺得比較重要,容易出錯的地方也很多,希望看到這篇博客的人如果覺得我有哪些地方寫得不好或者出錯了,能給我回復一下下,小女子感激不盡!

發佈了22 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章