Linux下文件及目录的一些操作(附递归遍历目录源码)

时间:2022-03-13 17:11:58
1.获取当前工作目录
#include <unistd.h>
1.char *getcwd(char *buf,size_t size);
2.
3.其中,buf为缓冲区地址,size为给出的最大路径名长度。如果当前工作目录的路径名长度大于给定的长度,则返回NULL并置errno为ERANGE。函数调用成功时,返回指向路径名的指针;否则返回NULL
4.
5.例:
6.char *name = new char[256];
7.if(getcwd(name,255)!=NULL)
8.    cout<<"current dir is: "<<name<<endl;
9.delete [] name;
2. stat结构体
 
1.#include <sys/stat.h>
2.
3.struct stat
4.{
5.  mode_t st_mode;       //文件类型和权限信息
6.  ino_t st_ino;         //i结点标识
7.  dev_t st_dev;         //device number (file system)
8.  dev_t st_rdev;        //device number for special files
9.  nlink_t st_nlink;     //符号链接数
10.  uid_t st_uid;         //用户ID
11.  gid_t st_gid;         //组ID
12.  off_t st_size;        //size in bytes,for regular files
13.  time_t st_st_atime;   //最后一次访问的时间
14.  time_t st_mtime;      //文件内容最后一次被更改的时间
15.  time_t st_ctime;      //文件结构最后一次被更改的时间
16.  blksize_t st_blksize; //best I/O block size
17.  blkcnt_t st_blocks;   //number of disk blocks allocated
18.}
1.获取文件stat结构体信息的三个函数
2.
3.#include <sys/types.h>
4.#include <sys/stat.h>
5.#include <unistd.h>
6.
7.int stat(const char *path, struct stat *buf);
8.int fstat(int fieldes, struct stat *buf);
9.int lstat(const char *path, struct stat *buf);
10.
11.成功则返回0,否则返回-1.
12.
13.其中,fstat的第一个参数int fields为文件的描述符。
14.fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路径直接写就可以了。
15.
16.stat与lstat的区别:
17.
18.当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。可以这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件(link)本身的。
3.dirent结构体,可以只关注d_name字段
 
1.#include <dirent.h>
2.
3.struct dirent
4.{
5.  long d_ino;                /* inode number 索引节点号 */   
6.  off_t d_off;               /* offset to this dirent 在目录文件中的偏移 */  
7.  unsigned short d_reclen;   /* length of this d_name 文件名长 */  
8.  unsigned char d_type;      /* the type of d_name 文件类型 */
9.  char d_name [NAME_MAX 1];  /* file name (null-terminated) 文件名,最长255字符 */  
10.}
 
4.读取目录的操作
 
1.//可能用到的函数
2.
3.#include <sys/types.h>
4.#include <dirent.h>
5.
6.DIR *opendir(const char *dirname);
7.struct dirent *readir(DIR *dirp);
8.void rewinddir(DIR *dirp);
9.int closedir(DIR *dirp);
10.
11.
12.//一个完整的递归遍历目录下子目录及文件的函数
13.
14.#include <unistd.h>
15.#include <stdio.h>
16.#include <dirent.h>
17.#include <string.h>
18.#include <stdlib.h>
19.
20.void printdir(char *dir, int depth)
21.{
22.  DIR *dp;
23.  struct direct *entry;
24.  struct stat statbuf;
25.
26.  if( (dp = opendir(dir))!=NULL )
27.  {
28.    chdir(dir);         //changedir,进入dir目录
29.    while( (entry = readdir(dp))!=NULL )
30.    {
31.      lstat(entry->d_name,&statbuf);
32.
33.      if( S_ISDIR(statbuf.st_mode) )
34.      {
35.        if(strcmp(".",entry->d_name)==0 || strcmp("..",entry->d_name)
36.          continue;
37.
38.        printf("%*s%s/\n",depth," ",entry->d_name);
39.        printdir(entry->d_name,depth+4);
40.      }
41.      else
42.        printf("%*s%s\n",depth," ",entry->d_name);
43.    }
44.
45.    chdir("..");
46.    closedir(dp);
47.  }
48.  else
49.  {
50.    fprintf(stderr,"cannot open directory: %s\n",dir);
51.    return;
52.  }
53.}
54.
55.int main()
56.{
57.  printf("Directory scan of /home:\n");
58.  printdir("/home",0);
59.  printf("Success!\n");
60.
61.  exit(0);
62.}
 
 5.注意:判断文件是目录文件还是普通文件有两种方式
   
1.struct dirent *entry;
2.struct stat st;
3.
4.entry = opendir(dir);
5.lstat(entry->d_name,&st);
6.S_ISDIR(st.st_mode); //是目录文件则函数返回true
7.S_ISREG(st.st_mode); //是普通文件则函数返回true
8.
9.//S_ISDIR和S_ISREG均为宏定义,可参见sys/stat.h.
10.//或者用以下方式
11.(st.st_mode & S_IFMT)==S_IFDIR //目录文件为true
12.(st.st_mode & S_IFMT)==S_IFREG //普通文件为true
13.//其中S_IFMT在sys/stat.h中被定义为八进制数170000,通过与st_mode进行位的与操作可得类型,另有S_IFBLK、S_IFCHR、S_IFIFO类型
 

转载原文:http://blog.chinaunix.net/uid-25829053-id-2853278.html