Linux目錄文件操作

1.stat  獲取文件屬性

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

       int stat(const char *filename,struct stat *buf);

       int fstat(fd, struct stat *buf);

       int lstat(const char *filename, struct stat *buf);

      

       fstat與stat的區別是fstat通過文件描述符指定文件;lstat與stat的區別在於,對於符號連接文件,lstat返回的是符號鏈接文件本身的狀態信息,而stat返回的是符號鏈接指向的文件狀態信心。

       成功返回0,錯誤範圍-1

 

2.  chown 設置文件屬性

       #include <sys/types.h>

       #include <unistd.h>

       int chown(const char *path,uid_t owner, gid_t group);

       int fchown(int fd, uid_t owner, gid_t group)’

       int lchown(const char *path, uid_t owner,gid_t group);

   

   fchown與chown的區別是fchown通過文件描述符指定文件;lchown與chown的區別在於,對於符號連接文件,lchown返回的是符號鏈接文件本身的狀態信息,而chown返回的是符號鏈接指向的文件狀態信心。

       成功返回0,錯誤範圍-1

       文件的所有者只能改變文件的組id爲其所屬組中的一個,超級用戶才能修改文件的所有者id,並且超級用戶可以任意修改文件的用戶組id。如果參數owner或group指定爲-1,那麼文件的用戶id和組id不會被改變。

 

3. truncate 改變文件大小

       #include <sys/types.h>

       #include <unistd.h>

       int truncate(const char *path, off_t length);

       int ftruncate(int fd, off_t length);

      

       將指定文件大小改爲參數length指定的大小,如果原來的文件比參數length大,則超過的部分會被刪除;如果原來的文件大小比參數length小,則文件將被擴展,擴展部分用0填充。

       成功返回0,錯誤範圍-1

 

4. utime 改變文件的st_mtime域和st_ctime域,即存取時間和修改時間。

       #include <sys/types.h>

       #include <utime.h>

       int utime(const char *filename,struct utimbuf *buf);

      

       #include <sys/time.h>

       int utime(char *filename,struct timeval *tvp);

 

       struct utimbuf

       {

              time_t actime;

              time_t modtime;

       }

       如果buf是一個空指針,則存取時間和修改時間都爲當前時間。

       成功返回0,錯誤範圍-1

 

5. umake 設置文件創建時的屏蔽字,並返回以前的值

       #include <sys/types.h>

       #include <sys/stat.h>

       mode_t umask(mode_t mask);

 

6. rename 文件的移動和修改文件名

       #include <stdio.h>

       int rename(const char *oldpath, const char *newpath);

       若newpath指定的文件已存在,則原文件會刪除

 

7. remove 文件的刪除

       #include <unistd.h>

       int unlink(const char *pathname);

       int remove(const char *pathname);

  

       文件的刪除可以使用unlink系統調用,目錄的刪除需要使用rmdir系統調用,而通用的既能刪除文件又能刪除目錄的系統調用是remove,remove內部封裝了unlink和rmdir。

       成功返回0,錯位返回-1。

 

8. mkdir 目錄的創建

       #include <sys/types.h>

       #include <sys/stat.h>

       int mkdir(const char *pathname, mode_t mode);

       成功返回0,錯位返回-1。

 

9. rmdir 目錄的刪除

       #include <unistd.h>

       int rmdir(const char *pathname);

      rmdir只能刪除空目錄,成功返回0,錯位返回-1。

 

10. getcwd 獲取當前目錄

       #include <unistd.h>

       char *gercwd(char *buf, size_t size);

       char *get_current_dir_name(void);

       char *getwd(char *buf);

      

       getcwd會將當前的工作目錄絕對路徑複製到參數buf所指的內存空間,參數size爲buf的空間大小。在調用此函數時,buf所指的內存空間要足夠大,若工作目錄絕對路徑的字符串長度超過參數size大小,則返回值爲NULL,errno的值爲ERANGE。倘若參數buf爲NULL,getcwd()會根據參數size的大小自動分配內存(使用malloc),如果size也爲0,則getcwd()會根據工作目錄絕對路徑的字符串長度來決定配置的內存大小。進程可以在使用完此字符串後利用free()來釋放空間。

       執行成功則將結果複製到參數buff所指向的內存空間,或是返回自動分配的字符串指針,失敗返回NULL.

 

11. chdir 設置工作目錄

       #include <unistd.h>

       int chdir(const char *path);

       int fchdir(int fd);

       chdir將工作目錄改爲由path指定的目錄,fchdir將工作目錄改爲由文件描述符fd指定的目錄。

       執行成功返回0,錯誤返回-1

 

12. 獲取目錄信息

1)  opendir

       #include <sys/types.h>

       #include <dirent.h>

       DIR *opendir(const char *name);

       opendir打開參數name指定的目錄,並返回DIR*形態的目錄劉,類似於文件描述符。成功返回目錄流,失敗返回NULL

2)  readdir

       #include <sys/types.h>

       #include <dirent.h>

       struct dirent *readdir(DIR *dir);

       readdir用來從dir所指向的目錄讀取出目錄的信息,返回一個struct dirent結構的指針。

       struct dirent

       {

              long d_ino;//此目錄i節點編號

              off_t d_off;//目錄文件開頭至此目錄進入點的位移

              unsigned short d_reclen;//d_name的長度

              char d_name[NAME_MAX+1];//以NULL結尾的文件名

       }

       函數執行成功範圍該目錄下一個文件的信息。如果用opendir打開某個目錄,第一次調用該函數,則返回的是該目錄下的第一個文件的信息。如果發生錯誤或者讀到目錄文件尾,返回NULL。

3)  closedir

       #include <sys/types.h>

       #include <dirent.h>

       int *closedir(DIR *dir);

       關閉目錄,成功返回0,失敗返回-1

 

13. symlink建立符號鏈接

       #include <unistd.h>

       Int symlink(const char *actualpath, const char *sympath);


下面給出三個實例分別實現不同的函數功能:

1.改變進程的當前目錄到指定的目錄然後打印出該目錄名

注意:改變的是當前進程的目錄,並不修改父進程,所以當程序退出後,功能不變

  1. /*改變進程的當前目錄到指定的目錄然後打印出該目錄名。*/  
  2. #include <unistd.h>  
  3. #include <limits.h>  
  4. #include <stdio.h>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     char path[1000];  
  9.     if(argc!=2)  
  10.     {  
  11.         printf("Usage ex3-7 <pathname>\n");  
  12.         return 1;  
  13.     }  
  14.     if(chdir(argv[1])<0)  
  15.     {  
  16.         printf("chdir failed\n");  
  17.         return 2;  
  18.     }  
  19.     if(getwd(path)==NULL)  
  20.     {  
  21.         printf("getwd failed\n");  
  22.         return 3;  
  23.     }  
  24.     printf("CWD =%s \n", path);  
  25.     return 0;  
  26. }  

2.創建一個目錄,然後刪除此目錄

  1. /*改變進程的當前目錄到指定的目錄然後打印出該目錄名。*/  
  2. #include <unistd.h>  
  3. #include <limits.h>  
  4. #include <stdio.h>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     char path[1000];  
  9.     if(argc!=2)  
  10.     {  
  11.         printf("Usage ex3-7 <pathname>\n");  
  12.         return 1;  
  13.     }  
  14.     if(chdir(argv[1])<0)  
  15.     {  
  16.         printf("chdir failed\n");  
  17.         return 2;  
  18.     }  
  19.     if(getwd(path)==NULL)  
  20.     {  
  21.         printf("getwd failed\n");  
  22.         return 3;  
  23.     }  
  24.     printf("CWD =%s \n", path);  
  25.     return 0;  
  26. }  

3.目錄打開,讀取和關閉函數的使用方法

  1. #include <sys/types.h>  
  2. #include <dirent.h>  
  3. #include <unistd.h>  
  4. #include <stdio.h>  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     char path[1000];  
  9.     DIR * dp;  
  10.     struct dirent *pdirent;  
  11.     if(argc!=2)  
  12.     {  
  13.         printf("Usage  ex3-9 <pathname>\n");  
  14.         return 1;  
  15.     }  
  16.     if((dp=opendir(argv[1]))==NULL)  
  17.     {  
  18.         printf("Opendir %s failed\n", argv[1]);  
  19.         return 2;  
  20.     }  
  21.     if((pdirent=readdir(dp))==0)  
  22.     {  
  23.         printf("readdir %s failed\n", argv[1]);  
  24.         return 3;  
  25.     }  
  26.     printf("%s\n",pdirent->d_name);  
  27.     closedir(dp);  
  28.     return 0;  
  29. }  

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