目录操作

2014-07-23 11:56:31   最后更新: 2014-07-23 13:14:22   访问数量:669




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

 

定义于sys/stat.h头文件中,调用成功返回0,否则返回-1

次函数穿件创建一个新的空目录里,目录中会自动创建 . 和 . . 目录项

对于目录,通畅要至少设置一个执行权限位,以允许访问该目录中的文件名

 

int rmdir( const char *dirname, mode_t mode );

 

定义于unistd.h头文件中,调用成功返回0,否则返回-1

只能用于删除空目录,本质是调用unlink完成的

 

对某个目录具有访问权限的任意用户都可以读取该目录,但只有内核才能写目录,以防止文件系统产生混乱。目录的写权限和执行权限决定了是否能在该目录中删除和创建文件,而不是针对目录本身

 

以下函数都定义于dirent.h中

 

DIR* opendir (const char * path );

 

若调用成功返回指针,出错返回NULL

 

struct dirent* readdir(DIR* dir_handle);

 

若调用成功返回指针,若在目录结尾或出错返回NULL

 

void rewinddir(DIR *dp);

 

 

int closedir(DIR *dir);

 

调用成功返回0,否则返回-1

 

long int telldir(DIR *dirp);

 

返回与dirp相关联的目录中的当前位置

 

void seekdir (DIR *dp, long loc);

 

 

dirent结构与具体实现有关,但至少包含下列两个成员:

struct dirent { ino_t d_ino; char d_name[NAME_MAX + 1]; }

 

NAME_MAX的常用值是255

 

  • 操作

由opendir返回的指向DIR结构的指针由另外5个函数使用,opendir执行初始化工作

第一个readdir读到的是目录中的第一个目录项。

目录的各目录项的顺序与具体实现有关

 

e.g. 列出目录下全部目录项

#include "apue.h" #include <dirent.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if (argc != 2) err_quit("usage: ls directory_name"); if ((dp = opendir(argv[1])) == NULL) err_sys("can't open %s", argv[1]); while ((dirp = readdir(dp)) != NULL) printf("%s\n", dirp->d_name); closedir(dp); exit(0); }

 

 

e.g.

#include "../apue.2e/include/apue.h" #include <dirent.h> #include <limits.h> typedef int Myfunc (const char *, const struct stat *, int); static Myfunc myfunc; static int myftw (char *, Myfunc *); static int dopath (Myfunc *); static long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot; int main (int argc, char *argv[]) { int ret; if (argc != 2) err_quit ("usage: ftw <starting-pathname>"); ret = myftw (argv[1], myfunc); ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock; if (ntot == 0) ntot = 1; printf ("regular files = %7ld, %5.2f%%\n", nreg, nreg*100.0/ntot); printf ("directories = %7ld, %5.2f%%\n", ndir, ndir*100.0/ntot); printf ("block special = %7ld, %5.2f%%\n", nblk, nblk*100.0/ntot); printf ("char special = %7ld, %5.2f%%\n", nchr, nchr*100.0/ntot); printf ("fifo = %7ld, %5.2f%%\n", nchr, nchr*100.0/ntot); printf ("symbolic links = %7ld, %5.2f%%\n", nslink, nslink*100.0/ntot); printf ("socket files = %7ld, %5.2f%%\n", nsock, nsock*100.0/ntot); return ret; } #define FTW_F 1 #define FTW_D 2 #define FTW_DNR 3 #define FTW_NS 4 static char *fullpath; static int myftw (char *pathname, Myfunc *func) { int len; //开辟空间用于存储路径名,len作为返回该空间长度 fullpath = path_alloc (&len); strncpy (fullpath, pathname, len); //确保该串能够以0结尾 fullpath[len-1] = 0; return (dopath(func)); } static int dopath (Myfunc func) { struct stat statbuf; struct dirent *dirp; DIR *dp; int ret; char *ptr; //返回文件信息,但不跟随符号连接 if (lstat (fullpath, &statbuf) < 0) return (func(fullpath, &statbuf, FTW_NS)); //文件类型宏,判断正确返回1,否则返回0 if (S_ISDIR (statbuf.st_mode) == 0) return (func(fullpath, &statbuf, FTW_F)); if ((ret = func (fullpath, &statbuf, FTW_D)) != 0) return ret; ptr = fullpath + strlen (fullpath); *ptr++ = '/'; *ptr = 0; if ((dp = opendir (fullpath)) == NULL) return (func (fullpath, &statbuf, FTW_DNR)); while ((dirp = readdir(dp))!=NULL) { if (strcmp (dirp -> d_name, ".") == 0 || strcmp (dirp -> d_name, "..") == 0) continue; strcpy (ptr, dirp -> d_name); if ((ret = dopath(func)) != 0) break; } ptr[-1] = 0; if (closedir (dp) < 0) err_ret ("can't close dir %s", fullpath); return ret; } static int myfunc (const char *pathname, const struct stat *statptr, int type) { switch (type) { case FTW_F: switch (statptr -> st_mode & S_IFMT) { case S_IFREG: nreg++; break; case S_IFBLK: nblk++; break; case S_IFCHR: nchr++; break; case S_IFIFO: nfifo++; break; case S_IFLNK: nslink++; break; case S_IFSOCK: nsock++; break; case S_IFDIR: err_dump ("for S_IFDIR for %s", pathname); } break; case FTW_D: ndir++; break; case FTW_DNR: err_ret ("can't read directory %s", pathname); break; case FTW_NS: err_ret ("stat error for %s", pathname); break; default: err_dump("unknown type %d for pathname %s", type, pathname); } return 0; }

 

 

这个程序用到了C语言的函数变量,传递两个参数,分别是数据和处理方法,结构性很好,循环读目录是在第74行到第84行

 

  • 附. 静态函数

使某个函数只在一个源文件中有效,不能被其他源文件所用。

定义:在函数前面加上static。

说明:函数的声明和定义默认情况下在整个程序中是extern的。

静态函数的效果:

  1. 它允其他源文件建立并使用同名的函数,而不相互冲突。
  2. 声明为静态的函数不能被其他源文件所调用,因为它的名字不能得到。

 






读书笔记      技术帖      linux      unix      龙潭书斋      apue      unix环境高级编程      mkdir      rmdir      opendir      readdir      rewinddir      closedir      telldir      seekdir     


京ICP备15018585号