1. 程式人生 > >Linux C高階程式設計——目錄操作

Linux C高階程式設計——目錄操作

Linux C目錄操作

宗旨:技術的學習是有限的,分享的精神是無限的。

       Linux思想“一切皆檔案”,目錄也是檔案,只是儲存的內容有別於普通檔案。目錄檔案中儲存的該目錄下所有的檔案及子目錄檔案的資訊,inode節點。

一、開啟/關閉目錄檔案

1、 opendir

——開啟目錄

(1)函式原型

#include <dirent.h>
DIR *opendir(const char *dirname);

(2)函式引數

        dirname:要開啟的目錄路徑

(3)返回值

        執行成功返回一個目錄流指標(與檔案流類似,直接用就行),失敗返回NULL。

2、 closedir

——關閉指定的目錄流

(1)函式原型

#include <dirent.h>
int *closedir(DIR *stream);

(2)函式引數

       stream:目錄流指標(類似於檔案流指標fp一樣)

(3)返回值

        執行成功返回0,執行失敗返回-1。

這兩函式操作的物件DIR對使用者層是透明,不必關心其實現細節。

【typedef struct dirstream DIR】

二、/寫目錄內容

1、 readdir

——讀取目錄內容(目錄下儲存的是該目錄下的檔名和對應的磁碟inode資訊位置,讀取目錄內容就是讀取該目錄下的檔名及檔案資訊。)

(1) 函式原型

struct dirent *readdir(DIR *stream)
struct dirent
{
  long d_ino;               // inode值
  off_t d_off;               //從目錄開始到當前目錄條的距離
  unsigned shortd_reclen;    // 儲存檔名的空間大小
  unsigned char d_type;      // 檔案型別
  char d_name[256];         // 檔名,’\0’結束
};

(2)函式引數

        stream:目錄流指標

(3)返回值

        每呼叫一次,返回指向下一個目錄的指標,失敗返回NULL。

2、 readdir_r

——讀取目錄內容(readdir在多執行緒中不安全,readdir_t解決了多執行緒中不安全的問題)

(1)函式原型

int readdir_t(DIR *stream, struct dirent *entry, struct dirent **result);

(2)函式引數

        stream:目錄流指標

        entry:表示第一個引數所引用的目錄流中的當前位置

        result:指示的位置儲存指向該結構的目錄資訊

(3)返回值

        返回成功,在第三個引數返回一個指向描述目錄條目的struct dirent型別的指標,到達目錄結尾,則第三個引數中返回NULL指標,函式返回0;執行失敗返回-1.

三、定位目錄位置

1、 telldir

——目錄流相關聯的當前位置

(1)函式原型 

long int telldir(DIR *stream);

(2)函式引數

        stream:目錄流指標

(3)返回值

        成功返回一個long型別的位置值,指示目錄中的當前位置,失敗返回-1。

2、 seekdir

——在目錄流中設定下一個readdir操作的位置

(1)函式原型

void seekdir(DIR *stream, long int loc);

(2)函式引數

        stream:目錄流指標

        loc:從telldir()獲取的目錄流中的一個位置

(3)返回值

        無返回值,錯誤將設定errno

3、 rewinddir

——將目錄流的位置重置到目錄的開頭

(1)函式原型

void rewinddir(DIR *stream);

(2)函式引數

        stream:目錄流指標

(3)返回值

        將stream引用的目錄流的位置重置到目錄的開頭。

四、新增和刪除目錄

1、 mkdir

——建立一個目錄

(1)函式原型

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

(2)函式引數

        path:欲建立的檔案的路徑

        mode:目錄的訪問許可權,【mode&~umask&0777】

(3)返回值

        執行成功返回0,失敗返回-1。

2、 rmdir

——刪除目錄

(1)函式原型

int rmdir(const char *path);

(2)函式引數

        path:欲刪除的目錄檔案路徑

(3)返回值

         執行成功返回0,失敗返回-1。

五、獲取當前工作路徑操作

char *getcwd(char *buf, size_t size); // 將當前路徑的絕對路徑置於buf並返回buf,size的大小必須比返回的路徑名長度大1,否則返回NULL
 
char *get_current_dir_name(void);// 成功返回絕對路徑,失敗返回NULL<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">  </span>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[]) /* 瀏覽指定資料夾下的檔案 */
{
  DIR *stream;
  struct dirent *dp;

  stream = opendir(argv[1]);
  while((dp = readdir(stream)) != NULL)
  {
    if(dp->d_name[0] == '.')
    {
      continue;
    }
    printf("%s   ", dp->d_name);
  }
  closedir(stream);

  return 0;
}