亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

文件和目錄之讀目錄

2024-06-28 13:28:45
字體:
來源:轉載
供稿:網友
文件和目錄之讀目錄

對某個目錄具有訪問權限的任一用戶都可讀該目錄,但是,為了防止文件系統產生混亂,只有內核才能寫目錄。一個目錄的寫權限位和執行權限位決定了在該目錄中能否創建新文件以及刪除文件,它們并不表示能否寫目錄本身。

#include <dirent.h>DIR *opendir( const char *pathname );返回值:若成功則返回指針,若出錯則返回NULLstruct dirent *readdir( DIR *dp );返回值:若成功則返回指針,若在目錄結尾或出錯則返回NULLvoid rewinddir( DIR *dp );int closedir( DIR *dp );返回值:若成功則返回0,若出錯則返回-1long telldir( DIR *dp );返回值:與dp關聯的目錄中的當前位置void seekdir( DIR *dp, long loc );

頭文件<dirent.h>中定義的dirent結構與實現有關。幾種典型的UNIX實現對此結構所作的定義至少包含下列兩個成員:

struct dirent {    ino_t     d_ino;                  /* i-node number */    char     d_name[NAME_MAX + 1];    /*null-terminated filename */}

DIR結構是一個內部結構,上述6個函數用這個內部結構保存當前正被讀的目錄的有關信息。其作用類似與FILE結構。FILE結構由標準I/O庫維護。

由opendir返回的指向DIR結構的指針由另外5個函數使用。opendir執行初始化操作,使第一個readdir讀目錄中的第一個目錄項。目錄中各目錄項的順序與實現有關。它們通常并不按字母順序排序。

程序清單4-7 遞歸降序遍歷目錄層次結構,并按文件類型計數

[root@localhost apue]# cat -b PRog4-7.c     1  #include "apue.h"     2  #include <dirent.h>     3  #include <limits.h>     4  #include <errno.h>     5  #ifdef PATH_MAX     6  static int pathmax = PATH_MAX;     7  #else     8  static int pathmax = 0;     9  #endif    10  #define SUSV3 200112L    11  static long posix_version = 0;    12  /* If PATH_MAX is indeterminate, no guarantee  this is adequate */    13  #define PATH_MAX_GUESS 1024    14  char *    15  path_alloc(int *sizep) /* also return allocated size, if nonull */    16  {    17          char *ptr;    18          int size;    19          if(posix_version == 0)    20                  posix_version = sysconf(_SC_VERSION);    21    22          if(pathmax == 0) {   /* first time trough */    23                  errno = 0;    24                  if((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {    25                          if(errno == 0)    26                                  pathmax = PATH_MAX_GUESS;  /* it's indeterminate */    27                          else    28                                  err_sys("pathconf error for _PC_PATH_MAX");    29                  } else {    30                          pathmax++;    /* add one since it's relative to root */    31                  }    32          }    33          if(posix_version < SUSV3)    34                  size = pathmax + 1;    35          else    36                  size = pathmax;    37    38          if((ptr = malloc(size)) == NULL)    39                  err_sys("malloc error for pathname");    40          if(sizep != NULL)    41                  *sizep = size;    42          return(ptr);    43  }    44  /* function type that is called for each filename */    45  typedef int Myfunc( const char *, const struct stat *, int );    46  static Myfunc   myfunc;    47  static int      myftw( char *, Myfunc * );    48  static int      dopath( Myfunc * );    49  static long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;    50  int    51  main( int argc, char *argv[] )    52  {    53          int ret;    54    55          if( argc != 2 )    56                  err_quit( "usage: ftw <starting-pathname>" );    57    58          ret = myftw( argv[1], myfunc );         /* does it all */    59          ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;    60          if( ntot == 0 )    61                  ntot = 1;       /* avoid divide by 0; print 0 for all counts */    62          printf( "regular files  = %7ld, %5.2f %%/n", nreg, nreg*100.0/ntot );    63          printf( "directories    = %7ld, %5.2f %%/n", ndir, ndir*100.0/ntot );    64          printf( "block special  = %7ld, %5.2f %%/n", nblk, nblk*100.0/ntot );    65          printf( "char special   = %7ld, %5.2f %%/n", nchr, nchr*100.0/ntot );    66          printf( "FIFOs          = %7ld, %5.2f %%/n", nfifo, nfifo*100.0/ntot );    67          printf( "symbolic links = %7ld, %5.2f %%/n", nslink, nslink*100.0/ntot );    68          printf( "sockets                = %7ld, %5.2f %%/n", nsock, nsock*100.0/ntot );    69          exit( ret );    70  }    71  /*    72  * Descend throuth the hierarchy, starting at "pathname".    73  * The caller's func() is called for every file.    74  */    75  #define FTW_F   1       /* file other than directory */    76  #define FTW_D   2       /* directory */    77  #define FTW_DNR 3       /* directory that can't be read */    78  #define FTW_NS  4       /* file that we can't stat */    79  static char * fullpath; /*contains full pathname for every file */    80  static int    81  myftw( char *pathname, Myfunc *func )    82  {    83          int len;    84          fullpath = path_alloc( &len );  /* malloc's for PATH_MAX + 1 bytes */    85                                          /* program_list 2-3 */    86          strncpy( fullpath, pathname, len );     /* protect against */    87          fullpath[len - 1] = 0;    88          return(dopath(func));    89  }    90  /*    91  * Descend through the hierarchy, starting at "fullpath".    92  * If "fullpath" is anything other than a directory, we lstat() it,    93  * call func(), and return. For a directory, we call ourself     94  * recursively for each name in the directory.    95  */    96  static int    97  dopath( Myfunc *func )    98  {    99          struct stat     statbuf;   100          struct dirent   *dirp;   101          DIR             *dp;   102          int             ret;   103          char            *ptr;   104          if( lstat( fullpath, &statbuf ) < 0 )   /* stat error */   105                  return( func(fullpath, &statbuf, FTW_NS) );   106          if( S_ISDIR(statbuf.st_mode) == 0)      /* not a directory */   107                  return( func(fullpath, &statbuf, FTW_F) );   108          /*   109          * It's a directory. First call func() for the directory,   110          * then process each filename in the directory.   111          */   112          if((ret = func(fullpath, &statbuf, FTW_D)) != 0)   113                  return(ret);   114          ptr = fullpath + strlen(fullpath);      /* point to end of fullpath */   115          *ptr++ = '/';   116          *ptr = 0;   117          if((dp = opendir(fullpath)) == NULL)    /* can't read directory */   118                  return(func(fullpath, &statbuf, FTW_DNR));   119          while((dirp = readdir(dp)) != NULL)   120          {   121                  if(strcmp(dirp->d_name, ".") == 0 ||   122                     strcmp(dirp->d_name, "..") == 0)   123                          continue;       /* ignore dot and dot-dot */   124   125                  strcpy(ptr, dirp->d_name);      /*append name after slash */   126          //      if((ret = dopath(func)) != 0)   /* recursive */   127          //              break;                  /* time to leave */   128                  dopath(func);   129          }   130          ptr[-1] = 0;    /* erase everything from slash onwards */   131          if(closedir(dp) < 0)   132                  err_ret("can't close directory %s", fullpath);   133          return(ret);   134  }   135  static int   136  myfunc(const char *pathname, const struct stat *statptr, int type)   137  {   138          switch(type)   139          {   140                  case FTW_F:   141                          switch(statptr->st_mode & S_IFMT)   142                          {   143                                  case S_IFREG:   nreg++;         break;   144                                  case S_IFBLK:   nblk++;         break;   145                                  case S_IFCHR:   nchr++;         break;   146                                  case S_IFIFO:   nfifo++;        break;   147                                  case S_IFLNK:   nslink++;       break;   148                                  case S_IfsoCK:  nsock++;        break;   149                                  case S_IFDIR:   150                                          err_dump("for S_IFDIR for %s", pathname);   151                                          /* directories should have type = FTW_D */   152                          }   153                          break;   154                  case FTW_D:   155                          ndir++;   156                          break;   157                  case FTW_DNR:   158                          err_ret("can't read directory %s", pathname);   159                          break;   160                  case FTW_NS:   161                          err_ret("stat error for %s", pathname);   162                          break;   163                  default:   164                          err_dump("unknown type %d for pathname %s", type, pathname);   165          }   166          return( 0 );   167  }

程序運行結果:

[root@localhost apue]# ./prog4-7 /home/zhu/testregular files   =       3, 60.00 %directories     =       2, 40.00 %block special   =       0,  0.00 %char special    =       0,  0.00 %FIFOs           =       0,  0.00 %symbolic links  =       0,  0.00 %sockets         =       0,  0.00 %

上面的源程序代碼中有一個不理解的地方,第126-127行(這是APUE書中原來的代碼)。希望路過的有緣人可以指點一二,小弟不勝感激。將這兩行替換為128行,這樣能夠理解,而且程序正確執行。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线免费观看一区| 亚洲自拍偷拍区| 亚洲激情在线观看| 日韩黄色在线免费观看| 欧美精品激情在线观看| 日韩欧美国产骚| 欧美巨大黑人极品精男| 91av在线看| 亚洲国产91精品在线观看| 国产一区二区三区在线观看视频| 国产精品中文字幕久久久| 欧美激情亚洲国产| 亚洲免费伊人电影在线观看av| 成人女保姆的销魂服务| 色综合久久中文字幕综合网小说| 97免费视频在线播放| 亚洲国产欧美精品| 亚洲精品资源在线| 日韩中文字幕视频| 操人视频在线观看欧美| 亚洲精品美女在线观看| 日韩在线观看av| 91亚洲国产成人精品性色| 国产精品中文字幕久久久| 国产有码一区二区| 欧美大成色www永久网站婷| 一区二区欧美久久| 欧美情侣性视频| 96sao精品视频在线观看| 午夜剧场成人观在线视频免费观看| 精品伊人久久97| 一区二区三区视频免费在线观看| 国产精品观看在线亚洲人成网| 爱福利视频一区| 91在线视频导航| 欧美精品免费在线| 日韩欧美a级成人黄色| 欧美日韩国产影院| 欧美性猛交xxxx富婆| 午夜精品久久久久久99热| 在线中文字幕日韩| 亚洲男子天堂网| 狠狠色狠色综合曰曰| 国产精品美女在线| 欧美日韩成人免费| 国产精品激情av在线播放| 色妞欧美日韩在线| 色婷婷av一区二区三区在线观看| 国产欧美精品一区二区三区介绍| 欧美电影在线观看| 亚洲欧美在线免费| 欧美性猛交xxxx乱大交蜜桃| 成人免费观看49www在线观看| 亚洲性日韩精品一区二区| 日韩av在线播放资源| 亚洲美女在线看| 亚洲人午夜精品| 91极品女神在线| 国产一区二区色| 91极品视频在线| 国产在线观看一区二区三区| 日韩一区在线视频| 欧美性受xxxx白人性爽| 国产精品久久久久高潮| 日韩精品视频三区| 91av在线看| 久久精品久久久久| 亚洲国产另类久久精品| 正在播放国产一区| 亚洲美女性视频| 欧美理论在线观看| 国产精品私拍pans大尺度在线| 最新中文字幕亚洲| 亚洲国产精品va在线| 欧美色视频日本高清在线观看| 国产成人小视频在线观看| 欧美极品美女视频网站在线观看免费| 亚洲韩国青草视频| 亚洲精品视频播放| 欧美重口另类videos人妖| 国产精品第一视频| 亚洲japanese制服美女| 成人写真福利网| 亚洲少妇中文在线| 国模gogo一区二区大胆私拍| 日韩精品极品视频| 久久久亚洲影院| 狠狠躁夜夜躁人人爽天天天天97| 日韩欧美综合在线视频| 久久在线视频在线| 国产一区在线播放| 亚洲国产精品久久久久秋霞蜜臀| 亚洲图片欧美日产| 成人国产精品色哟哟| 欧美精品videosex性欧美| 欧美高清视频在线| 欧美午夜宅男影院在线观看| 精品久久在线播放| 亚洲精品日韩欧美| 欧美成年人视频网站| 成人免费自拍视频| 国产精品久久91| 国产亚洲视频在线| 日本精品久久久久影院| 久久精品国产精品亚洲| 九九综合九九综合| 亚洲视频在线免费观看| 国产日韩一区在线| 日本免费在线精品| 久久天天躁夜夜躁狠狠躁2022| 午夜欧美大片免费观看| 欧美裸身视频免费观看| 综合欧美国产视频二区| 欧美大片免费观看在线观看网站推荐| 国产精品极品在线| 91色视频在线导航| 国产视频自拍一区| 日韩在线观看av| 亚洲综合在线做性| 91精品国产网站| 国产精品第七十二页| 欧美激情三级免费| 精品二区三区线观看| 亚洲国产黄色片| 久久久精品一区二区三区| 欧美日韩成人精品| 国产精品免费福利| 欧美一区三区三区高中清蜜桃| 久久国内精品一国内精品| 国产不卡精品视男人的天堂| 亚洲free性xxxx护士白浆| 国产91成人在在线播放| 欧美激情在线有限公司| 亚洲va欧美va国产综合久久| 日韩欧美精品在线观看| 91精品国产高清久久久久久91| 美日韩丰满少妇在线观看| 国产一区二区三区日韩欧美| 亚洲精品欧美一区二区三区| 欧美巨乳美女视频| 日韩欧美在线视频日韩欧美在线视频| 国产热re99久久6国产精品| 少妇高潮久久久久久潘金莲| 热久久视久久精品18亚洲精品| 国a精品视频大全| 欧美中文字幕第一页| 国产精品极品美女粉嫩高清在线| 久久精品成人动漫| 国模视频一区二区三区| 精品调教chinesegay| 91精品啪aⅴ在线观看国产| 丰满岳妇乱一区二区三区| 精品日韩视频在线观看| 欧美日韩在线视频首页| 欧美性黄网官网| 亚洲电影免费观看高清完整版在线| 亚洲激情久久久| 欧美日韩一区二区三区在线免费观看| 国产一区二区三区在线播放免费观看| 亚洲人成网站免费播放| 在线观看精品自拍私拍| 91久久久久久久一区二区| 亚洲国产小视频| 亚洲性生活视频在线观看|