本章講述了一些基本的文件操作,文件主要包含兩方面的內容:(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第六章的一些筆記,覺得比較重要,容易出錯的地方也很多,希望看到這篇博客的人如果覺得我有哪些地方寫得不好或者出錯了,能給我回復一下下,小女子感激不盡!