zoukankan      html  css  js  c++  java
  • Linux下文件及目录的一些操作(附递归遍历目录源码)

    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/
    ",depth," ",entry->d_name);
    39.        printdir(entry->d_name,depth+4);
    40.      }
    41.      else
    42.        printf("%*s%s
    ",depth," ",entry->d_name);
    43.    }
    44.
    45.    chdir("..");
    46.    closedir(dp);
    47.  }
    48.  else
    49.  {
    50.    fprintf(stderr,"cannot open directory: %s
    ",dir);
    51.    return;
    52.  }
    53.}
    54.
    55.int main()
    56.{
    57.  printf("Directory scan of /home:
    ");
    58.  printdir("/home",0);
    59.  printf("Success!
    ");
    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

  • 相关阅读:
    初探JavaScript(一)——也谈元素节点、属性节点、文本节点
    解决Myeclipse下Debug出现Source not found以及sql server中导入数据报错
    Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
    Hadoop阅读笔记(五)——重返Hadoop目录结构
    Hadoop阅读笔记(四)——一幅图看透MapReduce机制
    可视化(番外篇)——在Eclipse RCP中玩转OpenGL
    可视化(番外篇)——SWT总结
    Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
    探秘Tomcat(一)——Myeclipse中导入Tomcat源码
    osgearth将视点绑定到一个节点上
  • 原文地址:https://www.cnblogs.com/lizihong/p/4323728.html
Copyright © 2011-2022 走看看